Layer.cpp revision 0f5131fe72f3e7ca599946536d1f6028bb93398d
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" 47b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza#include "MonitoredProducer.h" 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h" 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 501b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware/HWComposer.h" 511b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian 52875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian#include "RenderEngine/RenderEngine.h" 53875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define DEBUG_RESIZE 0 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 6013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianint32_t Layer::sSequence = 1; 6113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 624d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client, 634d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian const String8& name, uint32_t w, uint32_t h, uint32_t flags) 6413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : contentDirty(false), 6513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sequence(uint32_t(android_atomic_inc(&sSequence))), 6613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger(flinger), 67a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mTextureName(-1U), 6813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mPremultipliedAlpha(true), 6913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mName("unnamed"), 7013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat(PIXEL_FORMAT_NONE), 7113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mTransactionFlags(0), 727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStateMutex(), 737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates(), 74a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mQueuedFrames(0), 75399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStreamChanged(false), 76a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentTransform(0), 77933389f75814bb62e8153528f9cff2cb329b77dfMathias Agopian mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 78c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode(-1), 79a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentOpacity(true), 80cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber(0), 814d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending(false), 8282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian mFrameLatencyNeeded(false), 8313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering(false), 8413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mNeedsFiltering(false), 855cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), 8640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#ifndef USE_HWC2 8740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos mIsGlesComposition(false), 8840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#endif 8913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp(false), 9013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mHasSurface(false), 9103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mClientRef(client), 92a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mPotentialCursor(false), 93a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemLock(), 94a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition(), 95a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItems(), 9665476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mLastFrameNumberReceived(0), 9704839abb2dbfe7afe57ccc91902870aab52d30b8Pablo Ceballos mUpdateTexImageFailed(false), 98ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos mAutoRefresh(false) 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 1009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("Creating Layer %s", name.string()); 1029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 104a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mCurrentCrop.makeInvalid(); 1053f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian mFlinger->getRenderEngine().genTextures(1, &mTextureName); 10649457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); 1074d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1084d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian uint32_t layerFlags = 0; 1094d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eHidden) 1104125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerHidden; 1114125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (flags & ISurfaceComposerClient::eOpaque) 1124125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden layerFlags |= layer_state_t::eLayerOpaque; 113231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza if (flags & ISurfaceComposerClient::eSecure) 114231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza layerFlags |= layer_state_t::eLayerSecure; 1154d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1164d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian if (flags & ISurfaceComposerClient::eNonPremultiplied) 1174d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mPremultipliedAlpha = false; 1184d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1194d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mName = name; 1204d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1214d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.w = w; 1224d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.active.h = h; 1233dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.active.transform.set(0, 0); 124b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop.makeInvalid(); 125b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop.makeInvalid(); 1264d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.z = 0; 1279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mCurrentState.alpha = 1.0f; 1299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 1304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.alpha = 0xFF; 1319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.layerStack = 0; 1334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.flags = layerFlags; 1344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.sequence = 0; 1354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mCurrentState.requested = mCurrentState.active; 1364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 1374d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian // drawing state & current state are identical 1384d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mDrawingState = mCurrentState; 1396547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 1409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& hwc = flinger->getHwComposer(); 1429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); 1439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); 1449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 1456547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis nsecs_t displayPeriod = 1466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 1479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.setDisplayRefreshPeriod(displayPeriod); 149e8696a40e09b24b634214684d18526187b316a2fJamie Gennis} 150e8696a40e09b24b634214684d18526187b316a2fJamie Gennis 1513f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopianvoid Layer::onFirstRef() { 152bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden // Creates a custom BufferQueue for SurfaceFlingerConsumer to use 153b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferProducer> producer; 154b3d0bdf0dbc19f0a0d7d924693025371e24828fdDan Stoza sp<IGraphicBufferConsumer> consumer; 155b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 156b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mProducer = new MonitoredProducer(producer, mFlinger); 157b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName); 158bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 159399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSurfaceFlingerConsumer->setContentsChangedListener(this); 1604d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mSurfaceFlingerConsumer->setName(mName); 161b267579ba8dfe3f47d2a481c5a3c2254e3d565a1Daniel Lam 1627f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian#ifdef TARGET_DISABLE_TRIPLE_BUFFERING 1637f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian#warning "disabling triple buffering" 1647f42a9c47c5a7f40cf02032d286d6bd62f28e650Mathias Agopian#else 16519e3e06e3c65a7c001a6fe0971744ba5ff536515Pablo Ceballos mProducer->setMaxDequeuedBufferCount(2); 166303d538bb012e82c6b9a98c4930a03455000f761Mathias Agopian#endif 1676905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden 1688430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian const sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 1698430095879d2fa6878e68f8f12da4e704815ac09Mathias Agopian updateTransformHint(hw); 170b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 17196f0819f81293076e652792794a961543e6750d7Mathias Agopian 1724d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias AgopianLayer::~Layer() { 1738ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos sp<Client> c(mClientRef.promote()); 1748ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos if (c != 0) { 1758ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos c->detachLayer(this); 1768ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos } 1778ea4e7b878540647bb7ceeaa1d62d50cd458d9c6Pablo Ceballos 178cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mRemoteSyncPoints) { 179cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setTransactionApplied(); 180cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 181c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 182c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 183c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 184921e6ac4b7610a178285898d191eb0e3afe906c0Mathias Agopian mFlinger->deleteTextureAsync(mTextureName); 1856547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 18696f0819f81293076e652792794a961543e6750d7Mathias Agopian} 18796f0819f81293076e652792794a961543e6750d7Mathias Agopian 18813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 18913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// callbacks 19013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 19113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 1939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::onLayerDisplayed(const sp<Fence>& releaseFence) { 1949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.empty()) { 1959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 1969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 1979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->setReleaseFence(releaseFence); 1989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 1999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 200c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& /* hw */, 20113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian HWComposer::HWCLayerInterface* layer) { 20213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (layer) { 20313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer->onDisplayed(); 20413f01cbdbd34779a234bc674df79e23672fd5c0bJesse Hall mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); 20513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 20613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 2079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 20813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2096b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameAvailable(const BufferItem& item) { 2106b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza // Add this buffer from our internal queue tracker 2116b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza { // Autolock scope 2126b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 213a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 214a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Reset the frame number tracker when we receive the first buffer after 215a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // a frame number reset 216a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (item.mFrameNumber == 1) { 217a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = 0; 218a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 219a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 220a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Ensure that callbacks are handled in order 221a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 222a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 223a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ms2ns(500)); 224a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza if (result != NO_ERROR) { 225a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 226a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 227a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 228a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2296b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.push_back(item); 230ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_inc(&mQueuedFrames); 231a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 232a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza // Wake up any pending callbacks 233a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 234a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza mQueueItemCondition.broadcast(); 2356b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2366b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 23799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian mFlinger->signalLayerUpdate(); 238579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian} 239579b3f88d03d06b897b778bd11818f5104677d1dMathias Agopian 2406b9454d1fee0347711af1746642aa7820b1ea04dDan Stozavoid Layer::onFrameReplaced(const BufferItem& item) { 2417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { // Autolock scope 2427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Mutex::Autolock lock(mQueueItemLock); 243a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2447dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Ensure that callbacks are handled in order 2457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (item.mFrameNumber != mLastFrameNumberReceived + 1) { 2467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza status_t result = mQueueItemCondition.waitRelative(mQueueItemLock, 2477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ms2ns(500)); 2487dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (result != NO_ERROR) { 2497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Timed out waiting on callback", mName.string()); 2507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 251a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 252a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 2537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mQueueItems.empty()) { 2547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("Can't replace a frame on an empty queue"); 2557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 2567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 2574d85da4a77203f4c361e48699e5598ebe8c77b32Pablo Ceballos mQueueItems.editItemAt(mQueueItems.size() - 1) = item; 2587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 2597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake up any pending callbacks 2607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mLastFrameNumberReceived = item.mFrameNumber; 2617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mQueueItemCondition.broadcast(); 2626b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 2636b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 2646b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 265399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hallvoid Layer::onSidebandStreamChanged() { 266399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_release_cas(false, true, &mSidebandStreamChanged) == 0) { 267399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was false 268399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mFlinger->signalLayerUpdate(); 269399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 270399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall} 271399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 2726710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// called with SurfaceFlinger::mStateLock from the drawing thread after 2736710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// the layer has been remove from the current state list (and just before 2746710604286401d4205c27235a252dd0e5008cc08Mathias Agopian// it's removed from the drawing state list) 27513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::onRemoved() { 276bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->abandon(); 27748d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian} 278cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 27913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 28013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// set-up 28113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 28213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 2831eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopianconst String8& Layer::getName() const { 28413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mName; 28513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 28613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 28713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianstatus_t Layer::setBuffers( uint32_t w, uint32_t h, 28813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian PixelFormat format, uint32_t flags) 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 29013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t const maxSurfaceDims = min( 29113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 29213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 29313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // never allow a surface larger than what our underlying GL implementation 29413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // can handle. 29513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 29613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 29713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return BAD_VALUE; 29813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 29913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 30013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFormat = format; 30113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 30203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews mPotentialCursor = (flags & ISurfaceComposerClient::eCursorWindow) ? true : false; 30313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 30413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentOpacity = getOpacityForFormat(format); 30513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 30613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); 30713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setDefaultBufferFormat(format); 30813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setConsumerUsageBits(getEffectiveUsage(0)); 30913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 31013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return NO_ERROR; 31113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 31213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza/* 3147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * The layer handle is just a BBinder object passed to the client 3157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * (remote process) -- we don't keep any reference on our side such that 3167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * the dtor is called when the remote side let go of its reference. 3177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * 3187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * LayerCleaner ensures that mFlinger->onLayerDestroyed() is called for 3197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza * this layer when the handle is destroyed. 3207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza */ 3217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozaclass Layer::Handle : public BBinder, public LayerCleaner { 3227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza public: 3237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza Handle(const sp<SurfaceFlinger>& flinger, const sp<Layer>& layer) 3247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza : LayerCleaner(flinger, layer), owner(layer) {} 3257dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3267dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza wp<Layer> owner; 3277dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}; 3287dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 3294d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopiansp<IBinder> Layer::getHandle() { 3304d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian Mutex::Autolock _l(mLock); 3314d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3324d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian LOG_ALWAYS_FATAL_IF(mHasSurface, 3334d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian "Layer::getHandle() has already been called"); 3344d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3354d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian mHasSurface = true; 3364d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian 3374d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian return new Handle(mFlinger, this); 338582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis} 339582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis 340b9b088375d33a87b201cdbe18be71802e2607717Dan Stozasp<IGraphicBufferProducer> Layer::getProducer() const { 341b9b088375d33a87b201cdbe18be71802e2607717Dan Stoza return mProducer; 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// h/w composer set-up 34613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 34713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 348a8bca8d84b559e7dcca010f7d6514333004020c7Mathias AgopianRect Layer::getContentCrop() const { 349a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // this is the crop rectangle that applies to the buffer 350a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // itself (as opposed to the window) 351f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Rect crop; 352f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!mCurrentCrop.isEmpty()) { 353a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if the buffer crop is defined, we use that 354f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis crop = mCurrentCrop; 355a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian } else if (mActiveBuffer != NULL) { 356a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // otherwise we use the whole buffer 357a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian crop = mActiveBuffer->getBounds(); 358f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } else { 359a8bca8d84b559e7dcca010f7d6514333004020c7Mathias Agopian // if we don't have a buffer yet, we use an empty/invalid crop 3604fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian crop.makeInvalid(); 361f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis } 362f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return crop; 363f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 364f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 365f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopianstatic Rect reduce(const Rect& win, const Region& exclude) { 366f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (CC_LIKELY(exclude.isEmpty())) { 367f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win; 368f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 369f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian if (exclude.isRect()) { 370f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return win.reduce(exclude.getBounds()); 371f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian } 372f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian return Region(win).subtract(exclude).getBounds(); 373f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian} 374f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 37513127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianRect Layer::computeBounds() const { 3761eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 3776c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return computeBounds(s.activeTransparentRegion); 3786c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine} 3796c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine 3806c925ede620f4080227bb1fe8a41e4b4502348f8Michael LentineRect Layer::computeBounds(const Region& activeTransparentRegion) const { 3816c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine const Layer::State& s(getDrawingState()); 38213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 383b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 384b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 385b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 38613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 3876c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 3886c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine return reduce(win, activeTransparentRegion); 38913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 39013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 3916b44267a3beb457e220cad0666c039d3a765cdb2Mathias AgopianFloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const { 39213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // the content crop is the area of the content that gets scaled to the 39313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layer's size. 3946b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian FloatRect crop(getContentCrop()); 39513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 396b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr // the crop is the area of the window that gets cropped, but not 39713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // scaled in any ways. 3981eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 39913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 40013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the projection's clipping to the window crop in 40113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // layerstack space, and convert-back to layer space. 4026b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // if there are no window scaling involved, this operation will map to full 4036b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // pixels in the buffer. 4046b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // FIXME: the 3 lines below can produce slightly incorrect clipping when we have 4056b44267a3beb457e220cad0666c039d3a765cdb2Mathias Agopian // a viewport clipping and a window transform. we should use floating point to fix this. 4060e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4070e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian Rect activeCrop(s.active.w, s.active.h); 408b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 409b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr activeCrop = s.crop; 4100e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian } 4110e8f1443b87f9009159cef6394de48894f98f826Mathias Agopian 4123dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr activeCrop = s.active.transform.transform(activeCrop); 413acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 414acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 415acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 416b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 417b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!activeCrop.intersect(s.finalCrop, &activeCrop)) { 418acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 419acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 420acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 4213dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr activeCrop = s.active.transform.inverse().transform(activeCrop); 42213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 42328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 42428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 42528ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 42628ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 42728ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 42828ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 429acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 430acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 431acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 43213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 433f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian // subtract the transparent region and snap to the bounds 434f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian activeCrop = reduce(activeCrop, s.activeTransparentRegion); 435f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian 436acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // Transform the window crop to match the buffer coordinate system, 437acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // which means using the inverse of the current transform set on the 438acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // SurfaceFlingerConsumer. 439acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos uint32_t invTransform = mCurrentTransform; 440acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 441acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos /* 442021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 443021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 444acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos */ 445021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransformOrient = 446021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 447acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // calculate the inverse transform 448acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransformOrient & NATIVE_WINDOW_TRANSFORM_ROT_90) { 449acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransformOrient ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 450acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 45113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 452acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // and apply to the current transform 4530f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos invTransform = (Transform(invTransformOrient) * Transform(invTransform)) 4540f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos .getOrientation(); 455acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 456acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 457acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winWidth = s.active.w; 458acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos int winHeight = s.active.h; 459acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 460acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // If the activeCrop has been rotate the ends are rotated but not 461acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // the space itself so when transforming ends back we can't rely on 462acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // a modification of the axes of rotation. To account for this we 463acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // need to reorient the inverse rotation in terms of the current 464acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // axes of rotation. 465acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0; 466acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0; 467acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (is_h_flipped == is_v_flipped) { 468acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 469acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos NATIVE_WINDOW_TRANSFORM_FLIP_H; 470acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 471acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winWidth = s.active.h; 472acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos winHeight = s.active.w; 473acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 474acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Rect winCrop = activeCrop.transform( 475acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos invTransform, s.active.w, s.active.h); 47613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 477acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos // below, crop is intersected with winCrop expressed in crop's coordinate space 478acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float xScale = crop.getWidth() / float(winWidth); 479acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float yScale = crop.getHeight() / float(winHeight); 48013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 481acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetL = winCrop.left * xScale; 482acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetT = winCrop.top * yScale; 483acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetR = (winWidth - winCrop.right ) * xScale; 484acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos float insetB = (winHeight - winCrop.bottom) * yScale; 485acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 486acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.left += insetL; 487acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.top += insetT; 488acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.right -= insetR; 489acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos crop.bottom -= insetB; 49013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 49113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return crop; 49213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 49313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 4949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 4959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setGeometry(const sp<const DisplayDevice>& displayDevice) 4969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 4974fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopianvoid Layer::setGeometry( 4984297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian const sp<const DisplayDevice>& hw, 4994fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian HWComposer::HWCLayerInterface& layer) 5009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 501a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian{ 5029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 5039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto hwcId = displayDevice->getHwcDisplayId(); 5049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 5059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 50613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setDefaultState(); 5079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 508a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian 5093e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian // enable this layer 5109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 5119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = false; 5129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (isSecure() && !displayDevice->isSecure()) { 5149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 5159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 5189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 5193e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setSkip(false); 520a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 521dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (isSecure() && !hw->isSecure()) { 522dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis layer.setSkip(true); 523dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis } 5249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 525dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 52613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this gives us only the "orientation" component of the transform 5271eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 5289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 5299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (!isOpaque(s) || s.alpha != 1.0f) { 5309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto blendMode = mPremultipliedAlpha ? 5319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza HWC2::BlendMode::Premultiplied : HWC2::BlendMode::Coverage; 5329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setBlendMode(blendMode); 5339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set blend mode %s:" 5349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza " %s (%d)", mName.string(), to_string(blendMode).c_str(), 5359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 5369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 5379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 5384125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (!isOpaque(s) || s.alpha != 0xFF) { 53913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setBlending(mPremultipliedAlpha ? 54013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian HWC_BLENDING_PREMULT : 54113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian HWC_BLENDING_COVERAGE); 54213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 5439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 54413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 54513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply the layer's transform, followed by the display's global transform 54613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // here we're guaranteed that the layer's transform preserves rects 5476c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine Region activeTransparentRegion(s.activeTransparentRegion); 548b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 549b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr Rect activeCrop(s.crop); 5503dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr activeCrop = s.active.transform.transform(activeCrop); 5519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 552acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { 5539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 554acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(hw->getViewport(), &activeCrop)) { 5559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 556acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 557acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5583dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr activeCrop = s.active.transform.inverse().transform(activeCrop); 55928ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // This needs to be here as transform.transform(Rect) computes the 56028ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transformed rect and then takes the bounding box of the result before 56128ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // returning. This means 56228ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // transform.inverse().transform(transform.transform(Rect)) != Rect 56328ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // in which case we need to make sure the final rect is clipped to the 56428ea217ff4e0aa9b03dfc12b6f47cccc6aaaae08Michael Lentine // display bounds. 565acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if(!activeCrop.intersect(Rect(s.active.w, s.active.h), &activeCrop)) { 566acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos activeCrop.clear(); 567acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5686c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine // mark regions outside the crop as transparent 5696c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, 0, s.active.w, activeCrop.top)); 5706c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, 5716c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, s.active.h)); 5726c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(0, activeCrop.top, 5736c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeCrop.left, activeCrop.bottom)); 5746c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine activeTransparentRegion.orSelf(Rect(activeCrop.right, activeCrop.top, 5756c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine s.active.w, activeCrop.bottom)); 5766c925ede620f4080227bb1fe8a41e4b4502348f8Michael Lentine } 5773dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr Rect frame(s.active.transform.transform(computeBounds(activeTransparentRegion))); 578b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if(!frame.intersect(s.finalCrop, &frame)) { 580acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 581acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 582acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 584acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(displayDevice->getViewport(), &frame)) { 585acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 586acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 5879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr(displayDevice->getTransform()); 5889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect transformedFrame = tr.transform(frame); 5899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setDisplayFrame(transformedFrame); 5909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set display frame " 5919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "[%d, %d, %d, %d]: %s (%d)", mName.string(), transformedFrame.left, 5929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza transformedFrame.top, transformedFrame.right, 5939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza transformedFrame.bottom, to_string(error).c_str(), 5949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 5959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 5969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza FloatRect sourceCrop = computeCrop(displayDevice); 5979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSourceCrop(sourceCrop); 5989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set source crop " 5999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "[%.3f, %.3f, %.3f, %.3f]: %s (%d)", mName.string(), 6009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sourceCrop.left, sourceCrop.top, sourceCrop.right, 6019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sourceCrop.bottom, to_string(error).c_str(), 6029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setPlaneAlpha(s.alpha); 6059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set plane alpha %.3f: " 6069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), s.alpha, to_string(error).c_str(), 6079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setZOrder(s.z); 6109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set Z %u: %s (%d)", 6119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), s.z, to_string(error).c_str(), 6129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 6139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 614acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!frame.intersect(hw->getViewport(), &frame)) { 615acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos frame.clear(); 616acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 61713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& tr(hw->getTransform()); 61813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setFrame(tr.transform(frame)); 61913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setCrop(computeCrop(hw)); 6209f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian layer.setPlaneAlpha(s.alpha); 6219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 6229f8386e1118c10dd4927f62637ec7162569bdbdcMathias Agopian 62329a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian /* 62429a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * Transformations are applied in this order: 62529a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 1) buffer orientation/flip/mirror 62629a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 2) state transformation (window manager) 62729a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * 3) layer orientation (screen orientation) 62829a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian * (NOTE: the matrices are multiplied in reverse order) 62929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian */ 63029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 63129a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian const Transform bufferOrientation(mCurrentTransform); 6323dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr Transform transform(tr * s.active.transform * bufferOrientation); 633c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 634c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 635c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 636021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to the 637021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * buffer 638c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 639021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t invTransform = 640021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 641c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse transform 642c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 643c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 644c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian NATIVE_WINDOW_TRANSFORM_FLIP_H; 645c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 646c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and apply to the current transform 6470f5131fe72f3e7ca599946536d1f6028bb93398dPablo Ceballos transform = Transform(invTransform) * transform; 648c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 64929a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian 65029a367bb7c14c916e991a6a0028727bd06c1e16eMathias Agopian // this gives us only the "orientation" component of the transform 65113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t orientation = transform.getOrientation(); 6529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 6539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (orientation & Transform::ROT_INVALID) { 6549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // we can only handle simple transformation 6559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.forceClientComposition = true; 6569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 6579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto transform = static_cast<HWC2::Transform>(orientation); 6589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setTransform(transform); 6599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set transform %s: " 6609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "%s (%d)", mName.string(), to_string(transform).c_str(), 6619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 6629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 66413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 66513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we can only handle simple transformation 6663e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian layer.setSkip(true); 667a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian } else { 66813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setTransform(orientation); 669a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian } 6709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 671a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian} 672a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian 6739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 6749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::forceClientComposition(int32_t hwcId) { 6759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 6769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); 6779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 6789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].forceClientComposition = true; 6819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 6829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 6839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 6849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 6859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setPerFrameData(const sp<const DisplayDevice>& displayDevice) { 6869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply this display's projection's viewport to the visible region 6879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // before giving it to the HWC HAL. 6889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const Transform& tr = displayDevice->getTransform(); 6899e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const auto& viewport = displayDevice->getViewport(); 6909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Region visible = tr.transform(visibleRegion.intersect(viewport)); 6919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 6929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = mHwcLayers[hwcId].layer; 6939e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setVisibleRegion(visible); 6949e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 6959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set visible region: %s (%d)", mName.string(), 6969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 6979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza visible.dump(LOG_TAG); 6989e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 6999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza error = hwcLayer->setSurfaceDamage(surfaceDamageRegion); 7019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set surface damage: %s (%d)", mName.string(), 7039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza surfaceDamageRegion.dump(LOG_TAG); 7059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto compositionType = HWC2::Composition::Invalid; 7089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mSidebandStream.get()) { 7099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = HWC2::Composition::Sideband; 7109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setSidebandStream(mSidebandStream->handle()); 7119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set sideband stream %p: %s (%d)", 7139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mName.string(), mSidebandStream->handle(), 7149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7159e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7169e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7179e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7189e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mActiveBuffer == nullptr || mActiveBuffer->handle == nullptr) { 7199e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = HWC2::Composition::Client; 7209e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setBuffer(nullptr, Fence::NO_FENCE); 7219e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7229e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set null buffer: %s (%d)", mName.string(), 7239e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(error).c_str(), static_cast<int32_t>(error)); 7249e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7259e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7269e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7279e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mPotentialCursor) { 7289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza compositionType = HWC2::Composition::Cursor; 7299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto acquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 7319e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setBuffer(mActiveBuffer->handle, 7329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza acquireFence); 7339e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (error != HWC2::Error::None) { 7349e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("[%s] Failed to set buffer %p: %s (%d)", mName.string(), 7359e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mActiveBuffer->handle, to_string(error).c_str(), 7369e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 7379e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7389e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7399e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // If it's not a cursor, default to device composition 7409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers[hwcId].forceClientComposition) { 7449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Forcing Client composition", mName.string()); 7459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Client); 7469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else if (compositionType != HWC2::Composition::Invalid) { 7479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting %s composition", mName.string(), 7489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(compositionType).c_str()); 7499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, compositionType); 7509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } else { 7519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("[%s] Requesting Device composition", mName.string()); 7529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza setCompositionType(hwcId, HWC2::Composition::Device); 7539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 7559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 7564297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopianvoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 757d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer) { 75813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we have to set the visible region on every frame because 75913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we currently free it during onLayerDisplayed(), which is called 76013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // after HWComposer::commit() -- every frame. 76113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Apply this display's projection's viewport to the visible region 76213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // before giving it to the HWC HAL. 76313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& tr = hw->getTransform(); 76413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); 76513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian layer.setVisibleRegionScreen(visible); 766db4850c01ff02bf7f936aa427e1fa8af9abc8f22Dan Stoza layer.setSurfaceDamage(surfaceDamageRegion); 76740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); 768ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 769399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (mSidebandStream.get()) { 770399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall layer.setSidebandStream(mSidebandStream); 771399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } else { 772399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // NOTE: buffer can be NULL if the client never drew into this 773399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // layer yet, or if we ran out of memory 774399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall layer.setBuffer(mActiveBuffer); 775399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 776c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall} 7779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 7789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 7809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::updateCursorPosition(const sp<const DisplayDevice>& displayDevice) { 7819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto hwcId = displayDevice->getHwcDisplayId(); 7829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0 || 7839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza getCompositionType(hwcId) != HWC2::Composition::Cursor) { 7849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 7859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 7879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // This gives us only the "orientation" component of the transform 7889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza const State& s(getCurrentState()); 789dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 7909e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Apply the layer's transform, followed by the display's global transform 7919e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Here we're guaranteed that the layer's transform preserves rects 7929e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect win(s.active.w, s.active.h); 793b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 794b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 7959e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 7969e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza // Subtract the transparent region and snap to the bounds 7979e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza Rect bounds = reduce(win, s.activeTransparentRegion); 798baf416d62eec3045ba4fd61f2df60f3e82f12d52Dan Stoza Rect frame(s.active.transform.transform(bounds)); 7999e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza frame.intersect(displayDevice->getViewport(), &frame); 800b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 801b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 802acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 8039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& displayTransform(displayDevice->getTransform()); 8049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto position = displayTransform.transform(frame); 8059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 8069e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = mHwcLayers[hwcId].layer->setCursorPosition(position.left, 8079e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top); 8089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set cursor position " 8099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "to (%d, %d): %s (%d)", mName.string(), position.left, 8109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza position.top, to_string(error).c_str(), 8119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 8129e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 8139e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 814c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::setAcquireFence(const sp<const DisplayDevice>& /* hw */, 815d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian HWComposer::HWCLayerInterface& layer) { 816c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall int fenceFd = -1; 817d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 818d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian // TODO: there is a possible optimization here: we only need to set the 819d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian // acquire fence the first time a new buffer is acquired on EACH display. 820d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 82103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (layer.getCompositionType() == HWC_OVERLAY || layer.getCompositionType() == HWC_CURSOR_OVERLAY) { 822bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden sp<Fence> fence = mSurfaceFlingerConsumer->getCurrentFence(); 8231df8c345854155cbbcb9f80de9d12d66ea70ac08Jamie Gennis if (fence->isValid()) { 824c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall fenceFd = fence->dup(); 825dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall if (fenceFd == -1) { 826dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall ALOGW("failed to dup layer fence, skipping sync: %d", errno); 827dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 828dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 829dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 830c5c5a14c06de249d8e0445fd24699e1d9aa04549Jesse Hall layer.setAcquireFenceFd(fenceFd); 831c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian} 832c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian 83303414a1cfe6c1222fd7723949bd622f9cba145aaRiley AndrewsRect Layer::getPosition( 83403414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews const sp<const DisplayDevice>& hw) 83503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews{ 83603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews // this gives us only the "orientation" component of the transform 83703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews const State& s(getCurrentState()); 83803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 83903414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews // apply the layer's transform, followed by the display's global transform 84003414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews // here we're guaranteed that the layer's transform preserves rects 84103414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews Rect win(s.active.w, s.active.h); 842b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 843b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 84403414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 84503414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews // subtract the transparent region and snap to the bounds 84603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews Rect bounds = reduce(win, s.activeTransparentRegion); 8473dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr Rect frame(s.active.transform.transform(bounds)); 84803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews frame.intersect(hw->getViewport(), &frame); 849b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 850b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr frame.intersect(s.finalCrop, &frame); 851acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 85203414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews const Transform& tr(hw->getTransform()); 85303414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews return Rect(tr.transform(frame)); 85403414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews} 8559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 85603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews 85713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 85813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// drawing... 85913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 86013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 86113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::draw(const sp<const DisplayDevice>& hw, const Region& clip) const { 862c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, clip, false); 86313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 86413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 865c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw, 866c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const { 867c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), useIdentityTransform); 86813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 86913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 870c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::draw(const sp<const DisplayDevice>& hw) const { 871c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza onDraw(hw, Region(hw->bounds()), false); 872c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza} 873c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza 874c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip, 875c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 876edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 8771c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 8781c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 879a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (CC_UNLIKELY(mActiveBuffer == 0)) { 880edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // the texture has not been created yet, this Layer has 881179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // in fact never been drawn into. This happens frequently with 882179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // SurfaceView because the WindowManager can't know when the client 883179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // has drawn the first time. 884179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 885179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // If there is nothing under us, we paint the screen in black, otherwise 886179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // we just skip this update. 887179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian 888179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // figure out if there is something below us 889179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region under; 890f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopian const SurfaceFlinger::LayerVector& drawingLayers( 891f7ae69d4bd292110da976c8ae766a8ef083d731fMathias Agopian mFlinger->mDrawingState.layersSortedByZ); 892179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian const size_t count = drawingLayers.size(); 893179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian for (size_t i=0 ; i<count ; ++i) { 89413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer(drawingLayers[i]); 89513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (layer.get() == static_cast<Layer const*>(this)) 896179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian break; 8974297734c1156fd8ede7e9c61b1e439f9e1c18cd9Mathias Agopian under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 898179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 899179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian // if not everything below us is covered, we plug the holes! 900179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian Region holes(clip.subtract(under)); 901179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian if (!holes.isEmpty()) { 9021b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian clearWithOpenGL(hw, holes, 0, 0, 0, 1); 903179169e88e05261196b76d7ddf94aa870aafaf9aMathias Agopian } 904edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 905edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 906a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 90797eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // Bind the current buffer to the GL texture, and wait for it to be 90897eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden // ready for us to draw into. 909bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden status_t err = mSurfaceFlingerConsumer->bindTextureImage(); 910bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (err != NO_ERROR) { 91197eba8904c2f221c42a9473407223a4c3a213f75Andy McFadden ALOGW("onDraw: bindTextureImage failed (err=%d)", err); 912dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // Go ahead and draw the buffer anyway; no matter what we do the screen 913dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall // is probably going to have something visibly wrong. 914dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall } 915dc5b485f74edf2d2f31c62054eb6c180421a3adeJesse Hall 916dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool blackOutLayer = isProtected() || (isSecure() && !hw->isSecure()); 917dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis 918875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 919875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian 920dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis if (!blackOutLayer) { 921cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // TODO: we could be more subtle with isFixedSize() 922eba8c688f633f3f3f1b75c2bc64faf799dd2b5f2Mathias Agopian const bool useFiltering = getFiltering() || needsFiltering(hw) || isFixedSize(); 923cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 924cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Query the texture matrix given our current filtering mode. 925cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis float textureMatrix[16]; 926bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setFilteringEnabled(useFiltering); 927bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->getTransformMatrix(textureMatrix); 928cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis 929c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (mSurfaceFlingerConsumer->getTransformToDisplayInverse()) { 930c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 931c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian /* 932021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the code below applies the primary display's inverse transform to 933021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos * the texture transform 934c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian */ 935c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 936c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // create a 4x4 transform matrix from the display transform flags 937c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipH(-1,0,0,0, 0,1,0,0, 0,0,1,0, 1,0,0,1); 938c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 flipV( 1,0,0,0, 0,-1,0,0, 0,0,1,0, 0,1,0,1); 939c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 rot90( 0,1,0,0, -1,0,0,0, 0,0,1,0, 1,0,0,1); 940c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 941c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian mat4 tr; 942021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos uint32_t transform = 943021623b5a82e44e8dc1a7def1abfed351187593cPablo Ceballos DisplayDevice::getPrimaryDisplayOrientationTransform(); 944c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_ROT_90) 945c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * rot90; 946c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_H) 947c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipH; 948c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian if (transform & NATIVE_WINDOW_TRANSFORM_FLIP_V) 949c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = tr * flipV; 950c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 951c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // calculate the inverse 952c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian tr = inverse(tr); 953c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 954c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian // and finally apply it to the original texture matrix 955c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian const mat4 texTransform(mat4(static_cast<const float*>(textureMatrix)) * tr); 956c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian memcpy(textureMatrix, texTransform.asArray(), sizeof(textureMatrix)); 957c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian } 958c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian 959cbb1a95819ec302ae15e4a1162a8b1349ae5c33eJamie Gennis // Set things up for texturing. 96049457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setDimensions(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 96149457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setFiltering(useFiltering); 96249457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian mTexture.setMatrix(textureMatrix); 96349457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian 96449457ac092071a8f964f7f69156093657ccdc3d0Mathias Agopian engine.setupLayerTexturing(mTexture); 965a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } else { 966875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.setupLayerBlackedOut(); 967a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 968c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza drawWithOpenGL(hw, clip, useIdentityTransform); 969875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableTexturing(); 970edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 971edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 973c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::clearWithOpenGL(const sp<const DisplayDevice>& hw, 974c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza const Region& /* clip */, float red, float green, float blue, 975c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza float alpha) const 97613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 97719733a32799f792125913e746e8644d16f8dc223Mathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 978c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, false); 97919733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.setupFillWithColor(red, green, blue, alpha); 98019733a32799f792125913e746e8644d16f8dc223Mathias Agopian engine.drawMesh(mMesh); 98113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 98213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 98313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::clearWithOpenGL( 98413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<const DisplayDevice>& hw, const Region& clip) const { 98513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian clearWithOpenGL(hw, clip, 0,0,0,0); 98613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 98713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 988c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::drawWithOpenGL(const sp<const DisplayDevice>& hw, 989c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza const Region& /* clip */, bool useIdentityTransform) const { 9901eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const State& s(getDrawingState()); 99113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 992c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza computeGeometry(hw, mMesh, useIdentityTransform); 99313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 99413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian /* 99513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * NOTE: the way we compute the texture coordinates here produces 99613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * different results than when we take the HWC path -- in the later case 99713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * the "source crop" is rounded to texel boundaries. 99813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * This can produce significantly different results when the texture 99913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * is scaled by a large amount. 100013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * 100113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * The GL code below is more logical (imho), and the difference with 100213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * HWC is due to a limitation of the HWC API to integers -- a question 1003c1c05de415854eb7a13a16b7e22a22de8515123aMathias Agopian * is suspend is whether we should ignore this problem or revert to 100413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * GL composition when a buffer scaling is applied (maybe with some 100513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * minimal value)? Or, we could make GL behave like HWC -- but this feel 100613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian * like more of a hack. 100713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian */ 1008acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos Rect win(computeBounds()); 1009acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1010b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1011acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win = s.active.transform.transform(win); 1012b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!win.intersect(s.finalCrop, &win)) { 1013acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1014acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1015acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win = s.active.transform.inverse().transform(win); 1016acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!win.intersect(computeBounds(), &win)) { 1017acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos win.clear(); 1018acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1019acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 102013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10213f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float left = float(win.left) / float(s.active.w); 10223f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float top = float(win.top) / float(s.active.h); 10233f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float right = float(win.right) / float(s.active.w); 10243f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian float bottom = float(win.bottom) / float(s.active.h); 102513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1026875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // TODO: we probably want to generate the texture coords with the mesh 1027875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian // here we assume that we only have 4 vertices 1028ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> texCoords(mMesh.getTexCoordArray<vec2>()); 1029ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[0] = vec2(left, 1.0f - top); 1030ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[1] = vec2(left, 1.0f - bottom); 1031ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[2] = vec2(right, 1.0f - bottom); 1032ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian texCoords[3] = vec2(right, 1.0f - top); 103313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1034875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian RenderEngine& engine(mFlinger->getRenderEngine()); 10354125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), s.alpha); 10365cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian engine.drawMesh(mMesh); 1037875d8e1323536e16dcfc90c9674d7ad32116a69aMathias Agopian engine.disableBlending(); 103813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 103913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 10409e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 10419e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, 10429e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza bool callIntoHwc) { 10439e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 10449e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setCompositionType called without a valid HWC layer"); 10459e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 10469e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10479e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcInfo = mHwcLayers[hwcId]; 10489e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto& hwcLayer = hwcInfo.layer; 10499e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV("setCompositionType(%" PRIx64 ", %s, %d)", hwcLayer->getId(), 10509e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), static_cast<int>(callIntoHwc)); 10519e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (hwcInfo.compositionType != type) { 10529e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGV(" actually setting"); 10539e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza hwcInfo.compositionType = type; 10549e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (callIntoHwc) { 10559e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza auto error = hwcLayer->setCompositionType(type); 10569e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set " 10579e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "composition type %s: %s (%d)", mName.string(), 10589e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza to_string(type).c_str(), to_string(error).c_str(), 10599e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza static_cast<int32_t>(error)); 10609e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10619e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10629e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 10639e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 10649e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan StozaHWC2::Composition Layer::getCompositionType(int32_t hwcId) const { 10659e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 10669e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getCompositionType called without a valid HWC layer"); 10679e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return HWC2::Composition::Invalid; 10689e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10699e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).compositionType; 10709e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 10719e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 10729e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::setClearClientTarget(int32_t hwcId, bool clear) { 10739e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 10749e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("setClearClientTarget called without a valid HWC layer"); 10759e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return; 10769e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10779e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mHwcLayers[hwcId].clearClientTarget = clear; 10789e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 10799e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 10809e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::getClearClientTarget(int32_t hwcId) const { 10819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza if (mHwcLayers.count(hwcId) == 0) { 10829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza ALOGE("getClearClientTarget called without a valid HWC layer"); 10839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return false; 10849e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza } 10859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return mHwcLayers.at(hwcId).clearClientTarget; 10869e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 10879e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 10889e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 10891681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunkuint32_t Layer::getProducerStickyTransform() const { 10901681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int producerStickyTransform = 0; 10911681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk int ret = mProducer->query(NATIVE_WINDOW_STICKY_TRANSFORM, &producerStickyTransform); 10921681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (ret != OK) { 10931681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk ALOGW("%s: Error %s (%d) while querying window sticky transform.", __FUNCTION__, 10941681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk strerror(-ret), ret); 10951681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return 0; 10961681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk } 10971681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk return static_cast<uint32_t>(producerStickyTransform); 10981681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk} 10991681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk 1100cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozauint64_t Layer::getHeadFrameNumber() const { 1101cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mQueueItemLock); 1102cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!mQueueItems.empty()) { 1103cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mQueueItems[0].mFrameNumber; 1104cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1105cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return mCurrentFrameNumber; 11067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1107cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza} 11087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1109cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stozabool Layer::addSyncPoint(const std::shared_ptr<SyncPoint>& point) { 1110cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() <= mCurrentFrameNumber) { 1111cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Don't bother with a SyncPoint, since we've already latched the 1112cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // relevant frame 1113cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return false; 11147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1115cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1116cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1117cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLocalSyncPoints.push_back(point); 1118cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return true; 11197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 11207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 112113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setFiltering(bool filtering) { 112213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFiltering = filtering; 112313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 112413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 112513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::getFiltering() const { 112613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mFiltering; 112713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 112813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1129ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// As documented in libhardware header, formats in the range 1130ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// 0x100 - 0x1FF are specific to the HAL implementation, and 1131ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// are known to have no alpha channel 1132ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// TODO: move definition for device-specific range into 1133ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold// hardware.h, instead of using hard-coded values here. 1134ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 1135ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 11365773d3f5b2694c647e010246dff99acc70131289Mathias Agopianbool Layer::getOpacityForFormat(uint32_t format) { 1137a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian if (HARDWARE_IS_DEVICE_FORMAT(format)) { 1138a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return true; 1139ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold } 11405773d3f5b2694c647e010246dff99acc70131289Mathias Agopian switch (format) { 11415773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_RGBA_8888: 11425773d3f5b2694c647e010246dff99acc70131289Mathias Agopian case HAL_PIXEL_FORMAT_BGRA_8888: 1143dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return false; 11445773d3f5b2694c647e010246dff99acc70131289Mathias Agopian } 11455773d3f5b2694c647e010246dff99acc70131289Mathias Agopian // in all other case, we have no blending (also for unknown formats) 1146dd533712f8dd21c0dadfd5ce8a0ad85aa3e96adaMathias Agopian return true; 1147ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold} 1148ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 114913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 115013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// local state 115113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 115213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1153acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatic void boundPoint(vec2* point, const Rect& crop) { 1154acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x < crop.left) { 1155acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.left; 1156acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1157acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->x > crop.right) { 1158acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->x = crop.right; 1159acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1160acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y < crop.top) { 1161acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.top; 1162acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1163acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (point->y > crop.bottom) { 1164acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos point->y = crop.bottom; 1165acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1166acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 1167acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1168c701401f8cec2e5309f8b57e2b97baced5093274Dan Stozavoid Layer::computeGeometry(const sp<const DisplayDevice>& hw, Mesh& mesh, 1169c701401f8cec2e5309f8b57e2b97baced5093274Dan Stoza bool useIdentityTransform) const 117013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 11711eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1172acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos const Transform tr(hw->getTransform()); 117313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t hw_h = hw->getHeight(); 117413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian Rect win(s.active.w, s.active.h); 1175b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.crop.isEmpty()) { 1176b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr win.intersect(s.crop, &win); 117713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 11786c7f25afb75ac155bad0b3bc17c0089d0337d060Mathias Agopian // subtract the transparent region and snap to the bounds 1179f3e85d432749ca77ad707bec523b67d741d43e6eMathias Agopian win = reduce(win, s.activeTransparentRegion); 11803f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian 1181acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lt = vec2(win.left, win.top); 1182acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 lb = vec2(win.left, win.bottom); 1183acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rb = vec2(win.right, win.bottom); 1184acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos vec2 rt = vec2(win.right, win.top); 1185acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1186acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos if (!useIdentityTransform) { 1187acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos lt = s.active.transform.transform(lt); 1188acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos lb = s.active.transform.transform(lb); 1189acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos rb = s.active.transform.transform(rb); 1190acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos rt = s.active.transform.transform(rt); 1191acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1192acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1193b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (!s.finalCrop.isEmpty()) { 1194b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(<, s.finalCrop); 1195b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&lb, s.finalCrop); 1196b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rb, s.finalCrop); 1197b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr boundPoint(&rt, s.finalCrop); 1198acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos } 1199acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos 1200ff2ed70fa30f04b90dd1a2c06ec2319e157152d7Mathias Agopian Mesh::VertexArray<vec2> position(mesh.getPositionArray<vec2>()); 1201acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos position[0] = tr.transform(lt); 1202acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos position[1] = tr.transform(lb); 1203acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos position[2] = tr.transform(rb); 1204acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos position[3] = tr.transform(rt); 12053f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian for (size_t i=0 ; i<4 ; i++) { 12065cdc8994a0ecd751a6350b16a1bef8b6b0d09b11Mathias Agopian position[i].y = hw_h - position[i].y; 120713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 120813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1209ac45e6bff1b41acd35c981291b37b23f8e083ceeEric Hassold 12104125a4ffaf374ca9c0773f256998557d3325343eAndy McFaddenbool Layer::isOpaque(const Layer::State& s) const 1211a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian{ 1212a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if we don't have a buffer yet, we're translucent regardless of the 1213a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // layer's opaque flag. 1214db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis if (mActiveBuffer == 0) { 1215a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian return false; 1216db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis } 1217a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 1218a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // if the layer has the opaque flag, then we're always opaque, 1219a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // otherwise we use the current buffer's format. 12204125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden return ((s.flags & layer_state_t::eLayerOpaque) != 0) || mCurrentOpacity; 1221a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian} 1222a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian 1223231160866738f6ed2175701f300fed1a8e8e02b0Dan Stozabool Layer::isSecure() const 1224231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza{ 1225231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza const Layer::State& s(mDrawingState); 1226231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza return (s.flags & layer_state_t::eLayerSecure); 1227231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza} 1228231160866738f6ed2175701f300fed1a8e8e02b0Dan Stoza 12297a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennisbool Layer::isProtected() const 12307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis{ 1231a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 12327a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis return (activeBuffer != 0) && 12337a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 12347a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1235b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 123613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isFixedSize() const { 1237c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return getEffectiveScalingMode() != NATIVE_WINDOW_SCALING_MODE_FREEZE; 123813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 123913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 124013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::isCropped() const { 124113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !mCurrentCrop.isEmpty(); 124213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 124313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 124413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::needsFiltering(const sp<const DisplayDevice>& hw) const { 124513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return mNeedsFiltering || hw->needsFiltering(); 124613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 124713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 124813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleRegion(const Region& visibleRegion) { 124913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 125013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleRegion = visibleRegion; 125113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 125213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 125313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setCoveredRegion(const Region& coveredRegion) { 125413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 125513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->coveredRegion = coveredRegion; 125613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 125713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 125813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::setVisibleNonTransparentRegion(const Region& 125913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setVisibleNonTransparentRegion) { 126013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always called from main thread 126113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->visibleNonTransparentRegion = setVisibleNonTransparentRegion; 126213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 126313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 126413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 126513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// transaction 126613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 126713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 12687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::pushPendingState() { 12697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mCurrentState.modified) { 12707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return; 12717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 12727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 12737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If this transaction is waiting on the receipt of a frame, generate a sync 12747dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // point and send it to the remote layer. 12757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mCurrentState.handle != nullptr) { 12767dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza sp<Handle> handle = static_cast<Handle*>(mCurrentState.handle.get()); 12777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza sp<Layer> handleLayer = handle->owner.promote(); 12787dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (handleLayer == nullptr) { 12797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] Unable to promote Layer handle", mName.string()); 12807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we can't promote the layer we are intended to wait on, 12817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // then it is expired or otherwise invalid. Allow this transaction 12827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // to be applied as per normal (no synchronization). 12837dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.handle = nullptr; 12843bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos } else { 12853bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos auto syncPoint = std::make_shared<SyncPoint>( 12863bddd5b7731fafd2c60e75416ccd091972d196aePablo Ceballos mCurrentState.frameNumber); 1287cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (handleLayer->addSyncPoint(syncPoint)) { 1288cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.push_back(std::move(syncPoint)); 1289cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 1290cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We already missed the frame we're supposed to synchronize 1291cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // on, so go ahead and apply the state update 1292cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentState.handle = nullptr; 1293cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 12947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 12957dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 12967dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Wake us up to check if the frame has been received 12977dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 12987dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 12997dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.push_back(mCurrentState); 13007dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13017dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 130205289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::popPendingState(State* stateToCommit) { 130305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos auto oldFlags = stateToCommit->flags; 130405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos *stateToCommit = mPendingStates[0]; 130505289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos stateToCommit->flags = (oldFlags & ~stateToCommit->mask) | 130605289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos (stateToCommit->flags & stateToCommit->mask); 13077dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13087dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mPendingStates.removeAt(0); 13097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 131105289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosbool Layer::applyPendingStates(State* stateToCommit) { 13127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza bool stateUpdateAvailable = false; 13137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza while (!mPendingStates.empty()) { 13147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mPendingStates[0].handle != nullptr) { 13157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.empty()) { 13167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we don't have a sync point for this, apply it anyway. It 13177dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // will be visually wrong, but it should keep us from getting 13187dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // into too much trouble. 13197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza ALOGE("[%s] No local sync point found", mName.string()); 132005289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 13217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 13227dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza continue; 13237dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1325cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (mRemoteSyncPoints.front()->getFrameNumber() != 1326cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mPendingStates[0].frameNumber) { 1327cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ALOGE("[%s] Unexpected sync point frame number found", 1328cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mName.string()); 1329cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1330cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Signal our end of the sync point and then dispose of it 1331cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 1332cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mRemoteSyncPoints.pop_front(); 1333cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 1334cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1335cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 13367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (mRemoteSyncPoints.front()->frameIsAvailable()) { 13377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Apply the state update 133805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 13397dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 13407dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13417dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // Signal our end of the sync point and then dispose of it 13427dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.front()->setTransactionApplied(); 13437dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mRemoteSyncPoints.pop_front(); 1344792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza } else { 1345792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza break; 13467dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13477dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } else { 134805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos popPendingState(stateToCommit); 13497dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza stateUpdateAvailable = true; 13507dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13527dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13537dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // If we still have pending updates, wake SurfaceFlinger back up and point 13547dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // it at this layer so we can process them 13557dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza if (!mPendingStates.empty()) { 13567dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza setTransactionFlags(eTransactionNeeded); 13577dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 13587dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13597dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13607dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 13617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return stateUpdateAvailable; 13627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13637dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13647dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::notifyAvailableFrames() { 1365cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 1366cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1367cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 1368cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (headFrameNumber >= point->getFrameNumber()) { 1369cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1370cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 13717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 13737dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 137413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::doTransaction(uint32_t flags) { 13751c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 13761c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 13777dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 137805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos Layer::State c = getCurrentState(); 137905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos if (!applyPendingStates(&c)) { 13807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza return 0; 13817dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 13827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 13831eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 1384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13851eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool sizeChanged = (c.requested.w != s.requested.w) || 13861eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != s.requested.h); 1387a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 1388a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian if (sizeChanged) { 1389cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian // the size changed, we need to ask our client to request a new buffer 13909d4536835248525f32f1504a3d28d5bbfa0a2910Steve Block ALOGD_IF(DEBUG_RESIZE, 13916905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 1392419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1393b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n" 1394419e196e639c8adb875da2765abcef95017b6d4aMathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1395b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1396c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr this, getName().string(), mCurrentTransform, 1397c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getEffectiveScalingMode(), 13981eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.active.w, c.active.h, 1399b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.left, 1400b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.top, 1401b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.right, 1402b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.bottom, 1403b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getWidth(), 1404b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr c.crop.getHeight(), 14051eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h, 14061eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian s.active.w, s.active.h, 1407b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, 1408b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.top, 1409b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, 1410b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.bottom, 1411b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getWidth(), 1412b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.getHeight(), 1413b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.requested.w, s.requested.h); 1414a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 14152a0d5b608447a880beff5149805425f02691442bJamie Gennis // record the new size, form this point on, when the client request 14162a0d5b608447a880beff5149805425f02691442bJamie Gennis // a buffer, it'll get the new size. 1417bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mSurfaceFlingerConsumer->setDefaultBufferSize( 14181eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian c.requested.w, c.requested.h); 1419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 1420cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian 14210cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian if (!isFixedSize()) { 14220cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 14231eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const bool resizePending = (c.requested.w != c.active.w) || 14241eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian (c.requested.h != c.active.h); 14250cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 14269e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza if (resizePending && mSidebandStream == NULL) { 142713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // don't let Layer::doTransaction update the drawing state 14280cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // if we have a pending resize, unless we are in fixed-size mode. 14290cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // the drawing state will be updated only once we receive a buffer 14300cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // with the correct size. 14310cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // 14320cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // in particular, we want to make sure the clip (which is part 14330cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // of the geometry state) is latched together with the size but is 14340cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian // latched immediately when no resizing is involved. 14359e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // 14369e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // If a sideband stream is attached, however, we want to skip this 14379e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // optimization so that transactions aren't missed when a buffer 14389e9b0445544f11fdbf21a29601567af2d1819a30Dan Stoza // never arrives 14390cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 14400cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian flags |= eDontUpdateGeometryState; 14410cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 14420cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian } 14430cd545f14261d829513e0d6e8fa5e4e4f3372b3dMathias Agopian 144413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // always set active to requested, unless we're asked not to 144513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // this is used by Layer, which special cases resizes. 144613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (flags & eDontUpdateGeometryState) { 144713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } else { 144805289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos c.active = c.requested; 144913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 145013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 14511eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (s.active != c.active) { 145213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 145313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= Layer::eVisibleRegion; 145413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 145513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 14561eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian if (c.sequence != s.sequence) { 145713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // invalidate and recompute the visible regions if needed 145813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian flags |= eVisibleRegion; 145913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian this->contentDirty = true; 146013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 146113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // we may use linear filtering, if the matrix scales us 14623dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr const uint8_t type = c.active.transform.getType(); 14633dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mNeedsFiltering = (!c.active.transform.preserveRects() || 146413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian (type >= Transform::SCALE)); 146513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 146613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1467c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // If the layer is hidden, signal and clear out all local sync points so 1468c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // that transactions for layers depending on this layer's frames becoming 1469c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza // visible are not blocked 1470c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza if (c.flags & layer_state_t::eLayerHidden) { 1471c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1472c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza for (auto& point : mLocalSyncPoints) { 1473c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza point->setFrameAvailable(); 1474c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1475c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza mLocalSyncPoints.clear(); 1476c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza } 1477c8145170a4b3bfdcfd6bd08b61ad55ae4eac9cc9Dan Stoza 147813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // Commit the transaction 147905289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos commitTransaction(c); 148013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return flags; 1481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 1482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 148305289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballosvoid Layer::commitTransaction(const State& stateToCommit) { 148405289c2b78d21308a95ea6ef8f1d8f24359147cdPablo Ceballos mDrawingState = stateToCommit; 1485a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian} 1486a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian 148713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getTransactionFlags(uint32_t flags) { 148813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_and(~flags, &mTransactionFlags) & flags; 148913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 149013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 149113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::setTransactionFlags(uint32_t flags) { 149213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return android_atomic_or(flags, &mTransactionFlags); 149313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 149413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 149513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setPosition(float x, float y) { 14963dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr if (mCurrentState.requested.transform.tx() == x && mCurrentState.requested.transform.ty() == y) 149713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 149813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 149969663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 150069663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // We update the requested and active position simultaneously because 150169663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // we want to apply the position portion of the transform matrix immediately, 150269663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr // but still delay scaling when resizing a SCALING_MODE_FREEZE layer. 15033dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set(x, y); 150469663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr mCurrentState.active.transform.set(x, y); 150569663fb0de2f112f525c4dcd7e2f7e0c879daaa4Robert Carr 15067dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 150713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 150813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 150913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 151013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayer(uint32_t z) { 151113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.z == z) 151213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 151313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 151413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.z = z; 15157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 151613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 151713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 151813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 151913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setSize(uint32_t w, uint32_t h) { 152013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.requested.w == w && mCurrentState.requested.h == h) 152113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 152213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.w = w; 152313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.requested.h = h; 15247dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 152513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 152613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 152713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 15289e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 15299e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozabool Layer::setAlpha(float alpha) { 15309e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 153113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setAlpha(uint8_t alpha) { 15329e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 153313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.alpha == alpha) 153413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 153513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 153613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.alpha = alpha; 15377dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 153813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 153913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 154013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 154113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setMatrix(const layer_state_t::matrix22_t& matrix) { 154213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 15433dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr mCurrentState.requested.transform.set( 154413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy); 15457dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 154613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 154713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 154813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 154913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setTransparentRegionHint(const Region& transparent) { 15502ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian mCurrentState.requestedTransparentRegion = transparent; 15517dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 155213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 155313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 155413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 155513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setFlags(uint8_t flags, uint8_t mask) { 155613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask); 155713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.flags == newFlags) 155813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 155913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 156013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.flags = newFlags; 15617dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.mask = mask; 15627dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 156313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 156413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 156513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 156613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setCrop(const Rect& crop) { 1567b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.crop == crop) 156813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 156913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 1570b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.crop = crop; 15717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 157213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 157313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 157413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 1575acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosbool Layer::setFinalCrop(const Rect& crop) { 1576b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr if (mCurrentState.finalCrop == crop) 1577acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return false; 1578acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.sequence++; 1579b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr mCurrentState.finalCrop = crop; 1580acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos mCurrentState.modified = true; 1581acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos setTransactionFlags(eTransactionNeeded); 1582acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos return true; 1583acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos} 158413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 1585c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrbool Layer::setOverrideScalingMode(int32_t scalingMode) { 1586c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (scalingMode == mOverrideScalingMode) 1587c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return false; 1588c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode = scalingMode; 1589c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return true; 1590c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1591c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 1592c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carruint32_t Layer::getEffectiveScalingMode() const { 1593c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr if (mOverrideScalingMode >= 0) { 1594c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mOverrideScalingMode; 1595c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr } 1596c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr return mCurrentScalingMode; 1597c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr} 1598c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr 159913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianbool Layer::setLayerStack(uint32_t layerStack) { 160013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mCurrentState.layerStack == layerStack) 160113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return false; 160213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.sequence++; 160313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mCurrentState.layerStack = layerStack; 16047dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 160513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian setTransactionFlags(eTransactionNeeded); 160613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return true; 1607a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian} 1608a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian 16097dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozavoid Layer::deferTransactionUntil(const sp<IBinder>& handle, 16107dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza uint64_t frameNumber) { 16117dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.handle = handle; 16127dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.frameNumber = frameNumber; 16137dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // We don't set eTransactionNeeded, because just receiving a deferral 16147dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza // request without any other state updates shouldn't actually induce a delay 16157dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = true; 16167dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza pushPendingState(); 1617792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.handle = nullptr; 1618792e529dee5b6cf839b982b4b06a37fbf1d3e28aDan Stoza mCurrentState.frameNumber = 0; 16197dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza mCurrentState.modified = false; 16207dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza} 16217dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1622ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useSurfaceDamage() { 1623ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza if (mFlinger->mForceFullDamage) { 1624ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = Region::INVALID_REGION; 1625ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } else { 1626ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion = mSurfaceFlingerConsumer->getSurfaceDamage(); 1627ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza } 1628ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1629ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1630ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stozavoid Layer::useEmptyDamage() { 1631ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.clear(); 1632ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza} 1633ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza 1634edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1635edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// pageflip handling... 1636edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------- 1637edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 16386b9454d1fee0347711af1746642aa7820b1ea04dDan Stozabool Layer::shouldPresentNow(const DispSync& dispSync) const { 1639ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mSidebandStreamChanged || mAutoRefresh) { 1640d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza return true; 1641d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza } 1642d87defaf486ff4e9c0066754564851cfb7be49edDan Stoza 16436b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 16440eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza if (mQueueItems.empty()) { 16450eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return false; 16460eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza } 16470eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza auto timestamp = mQueueItems[0].mTimestamp; 16486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza nsecs_t expectedPresent = 16496b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mSurfaceFlingerConsumer->computeExpectedPresent(dispSync); 16500eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 16510eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza // Ignore timestamps more than a second in the future 16520eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isPlausible = timestamp < (expectedPresent + s2ns(1)); 16530eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza ALOGW_IF(!isPlausible, "[%s] Timestamp %" PRId64 " seems implausible " 16540eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza "relative to expectedPresent %" PRId64, mName.string(), timestamp, 16550eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza expectedPresent); 16560eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza 16570eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza bool isDue = timestamp < expectedPresent; 16580eb2d398669bf11207c0fb22b11439250da0c8dcDan Stoza return isDue || !isPlausible; 16596b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza} 16606b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 16614d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopianbool Layer::onPreComposition() { 16624d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian mRefreshPending = false; 1663ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos return mQueuedFrames > 0 || mSidebandStreamChanged || mAutoRefresh; 166499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian} 166599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 1666d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopianvoid Layer::onPostComposition() { 1667d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian if (mFrameLatencyNeeded) { 1668bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden nsecs_t desiredPresentTime = mSurfaceFlingerConsumer->getTimestamp(); 166982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.setDesiredPresentTime(desiredPresentTime); 167082dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 1671bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden sp<Fence> frameReadyFence = mSurfaceFlingerConsumer->getCurrentFence(); 1672789a6c3f1dfe22a1ffea7f39b2098d7842cd1f30Jamie Gennis if (frameReadyFence->isValid()) { 167382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.setFrameReadyFence(frameReadyFence); 167482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis } else { 167582dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis // There was no fence for this frame, so assume that it was ready 167682dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis // to be presented at the desired present time. 167782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.setFrameReadyTime(desiredPresentTime); 167882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis } 167982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 1680d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian const HWComposer& hwc = mFlinger->getHwComposer(); 16819e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 16829e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza sp<Fence> presentFence = hwc.getRetireFence(HWC_DISPLAY_PRIMARY); 16839e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 168482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis sp<Fence> presentFence = hwc.getDisplayFence(HWC_DISPLAY_PRIMARY); 16859e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1686789a6c3f1dfe22a1ffea7f39b2098d7842cd1f30Jamie Gennis if (presentFence->isValid()) { 168782dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.setActualPresentFence(presentFence); 168882dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis } else { 168982dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis // The HWC doesn't support present fences, so use the refresh 169082dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis // timestamp instead. 169182dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis nsecs_t presentTime = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY); 169282dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.setActualPresentTime(presentTime); 169382dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis } 169482dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis 169582dbc7429f5f9f2b303b31dc5b9f2bfd1bbe6addJamie Gennis mFrameTracker.advanceFrame(); 1696d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian mFrameLatencyNeeded = false; 1697d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian } 1698d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian} 1699d3ee231eddce0b69ec5e35188dbd0f4a2c3b9ac3Mathias Agopian 17009e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 17019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stozavoid Layer::releasePendingBuffer() { 17029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza mSurfaceFlingerConsumer->releasePendingBuffer(); 17039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza} 17049e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 17059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza 1706da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopianbool Layer::isVisible() const { 170713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Layer::State& s(mDrawingState); 17089e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 17099e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza return !(s.flags & layer_state_t::eLayerHidden) && s.alpha > 0.0f 17109e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza && (mActiveBuffer != NULL || mSidebandStream != NULL); 17119e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 171213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return !(s.flags & layer_state_t::eLayerHidden) && s.alpha 1713afe3081e0e224a3d88da2e8f211e994f833cc6bbWonsik Kim && (mActiveBuffer != NULL || mSidebandStream != NULL); 17149e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 1715da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian} 1716da27af9832a0170f1fc40ef3f21371c4d30d21b3Mathias Agopian 17174fec873a98f7b4380720cd1ad006f74c8cdc73daMathias AgopianRegion Layer::latchBuffer(bool& recomputeVisibleRegions) 1718edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 17191c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis ATRACE_CALL(); 17201c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 1721399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall if (android_atomic_acquire_cas(true, false, &mSidebandStreamChanged) == 0) { 1722399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall // mSidebandStreamChanged was true 1723399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall mSidebandStream = mSurfaceFlingerConsumer->getSidebandStream(); 172412e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza if (mSidebandStream != NULL) { 172512e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza setTransactionFlags(eTransactionNeeded); 172612e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza mFlinger->setTransactionFlags(eTraversalNeeded); 172712e0a27aa30d9db10eafe88904d3eb8fdcbcfa71Dan Stoza } 17285bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall recomputeVisibleRegions = true; 17295bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall 17305bf786d8f00ff8eee64ebf330dac55e33a0f97b1Jesse Hall const State& s(getDrawingState()); 17313dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr return s.active.transform.transform(Region(Rect(s.active.w, s.active.h))); 1732399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall } 1733399184a4cd728ea1421fb0bc1722274a29e38f4aJesse Hall 17344fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian Region outDirtyRegion; 1735ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos if (mQueuedFrames > 0 || mAutoRefresh) { 173699ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 173799ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // if we've already called updateTexImage() without going through 173899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // a composition step, we have to skip this layer at this point 173999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // because we cannot call updateTeximage() without a corresponding 174099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // compositionComplete() call. 174199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian // we'll trigger an update in onPreComposition(). 17424d143eed994778d37eb09bb5d452c26f12bca6e1Mathias Agopian if (mRefreshPending) { 17434fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 174499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian } 174599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian 1746351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis // Capture the old state of the layer for comparisons later 17474125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden const State& s(getDrawingState()); 17484125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden const bool oldOpacity = isOpaque(s); 1749351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 1750db5230f4441fa8f120f15bdd6fcfc6e75d9c27d0Jamie Gennis 1751bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden struct Reject : public SurfaceFlingerConsumer::BufferRejecter { 17522c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian Layer::State& front; 17532c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian Layer::State& current; 17542c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian bool& recomputeVisibleRegions; 17551681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk bool stickyTransformSet; 1756b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr const char* name; 1757c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr int32_t overrideScalingMode; 1758b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr 17592c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian Reject(Layer::State& front, Layer::State& current, 1760b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr bool& recomputeVisibleRegions, bool stickySet, 1761c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr const char* name, 1762c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr int32_t overrideScalingMode) 17632c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian : front(front), current(current), 17641681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk recomputeVisibleRegions(recomputeVisibleRegions), 1765b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr stickyTransformSet(stickySet), 1766c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr name(name), 1767c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr overrideScalingMode(overrideScalingMode) { 17682c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 17692c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 17702c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian virtual bool reject(const sp<GraphicBuffer>& buf, 177111611f9be590480d7ea27bf0153558573ddcded2Dan Stoza const BufferItem& item) { 17722c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian if (buf == NULL) { 17732c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian return false; 17742c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 17752c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 17762c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian uint32_t bufWidth = buf->getWidth(); 17772c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian uint32_t bufHeight = buf->getHeight(); 17782c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 17792c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // check that we received a buffer of the right size 17802c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // (Take the buffer's orientation into account) 17812c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian if (item.mTransform & Transform::ROT_90) { 17822c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian swap(bufWidth, bufHeight); 17832c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 17842c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 1785c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr int actualScalingMode = overrideScalingMode >= 0 ? 1786c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr overrideScalingMode : item.mScalingMode; 1787c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr bool isFixedSize = actualScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 17882c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian if (front.active != front.requested) { 17892c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 17902c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian if (isFixedSize || 17912c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian (bufWidth == front.requested.w && 17922c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian bufHeight == front.requested.h)) 17932c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian { 17942c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // Here we pretend the transaction happened by updating the 17952c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // current and drawing states. Drawing state is only accessed 17962c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // in this thread, no need to have it locked 17972c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian front.active = front.requested; 17982c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 17992c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // We also need to update the current state so that 18002c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // we don't end-up overwriting the drawing state with 18012c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // this stale current state during the next transaction 18022c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // 18032c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // NOTE: We don't need to hold the transaction lock here 18042c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // because State::active is only accessed from this thread. 18052c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian current.active = front.active; 180639c88e8c7d870486f703408dafd0a62e7420df05Pablo Ceballos current.modified = true; 18072c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 18082c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // recompute visible region 18092c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian recomputeVisibleRegions = true; 18102c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 18112c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 18122c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian ALOGD_IF(DEBUG_RESIZE, 1813b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr "[%s] latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n" 18142c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 1815b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr " requested={ wh={%4u,%4u} }}\n", 1816b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr name, 18176905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden bufWidth, bufHeight, item.mTransform, item.mScalingMode, 18182c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian front.active.w, front.active.h, 1819b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.left, 1820b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.top, 1821b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.right, 1822b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.bottom, 1823b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.getWidth(), 1824b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.crop.getHeight(), 1825b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr front.requested.w, front.requested.h); 18262c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 18272c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 18281681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk if (!isFixedSize && !stickyTransformSet) { 18292c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian if (front.active.w != bufWidth || 18302c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian front.active.h != bufHeight) { 18314824d40a35333182c2eb3593511b9bcbecd0a943Mathias Agopian // reject this buffer 1832b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr ALOGE("[%s] rejecting buffer: " 1833b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr "bufWidth=%d, bufHeight=%d, front.active.{w=%d, h=%d}", 1834b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr name, bufWidth, bufHeight, front.active.w, front.active.h); 18352c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian return true; 18362c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 18372c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 18382ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian 18392ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian // if the transparent region has changed (this test is 18402ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian // conservative, but that's fine, worst case we're doing 18412ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian // a bit of extra work), we latch the new one and we 18422ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian // trigger a visible-region recompute. 18432ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian if (!front.activeTransparentRegion.isTriviallyEqual( 18442ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian front.requestedTransparentRegion)) { 18452ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian front.activeTransparentRegion = front.requestedTransparentRegion; 18466c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian 18476c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // We also need to update the current state so that 18486c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // we don't end-up overwriting the drawing state with 18496c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // this stale current state during the next transaction 18506c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // 18516c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // NOTE: We don't need to hold the transaction lock here 18526c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // because State::active is only accessed from this thread. 18536c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian current.activeTransparentRegion = front.activeTransparentRegion; 18546c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian 18556c67f0fe457f758fc875e1178d8fd5258fd8f6dfMathias Agopian // recompute visible region 18562ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian recomputeVisibleRegions = true; 18572ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian } 18582ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian 18592c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian return false; 18602c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 18612c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian }; 18622c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 18631681d95989271f3a9ac0dbb93d10e4a29f2b4444Ruben Brunk Reject r(mDrawingState, getCurrentState(), recomputeVisibleRegions, 1864c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr getProducerStickyTransform() != 0, mName.string(), 1865c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr mOverrideScalingMode); 18662c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian 18677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza 1868cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Check all of our local sync points to ensure that all transactions 1869cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // which need to have been applied prior to the frame which is about to 1870cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // be latched have signaled 1871cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1872cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto headFrameNumber = getHeadFrameNumber(); 1873cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza bool matchingFramesFound = false; 1874cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza bool allTransactionsApplied = true; 18757dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza { 1876cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 1877cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza for (auto& point : mLocalSyncPoints) { 1878cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (point->getFrameNumber() > headFrameNumber) { 18797dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza break; 18807dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1881cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 18827dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza matchingFramesFound = true; 1883cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1884cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!point->frameIsAvailable()) { 1885cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // We haven't notified the remote layer that the frame for 1886cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // this point is available yet. Notify it now, and then 1887cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // abort this attempt to latch. 1888cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point->setFrameAvailable(); 1889cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza allTransactionsApplied = false; 1890cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza break; 1891cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1892cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1893cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza allTransactionsApplied &= point->transactionIsApplied(); 18947dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza } 1895a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza } 1896a4650a50a0b35e9e4342d6600b6eb24fd94bb8e5Dan Stoza 1897cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (matchingFramesFound && !allTransactionsApplied) { 1898cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mFlinger->signalLayerUpdate(); 1899cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza return outDirtyRegion; 1900cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 1901cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 1902063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos // This boolean is used to make sure that SurfaceFlinger's shadow copy 1903063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos // of the buffer queue isn't modified when the buffer queue is returning 19043559fbf93801e2c0d9d8fb246fb9b867a361b464Pablo Ceballos // BufferItem's that weren't actually queued. This can happen in shared 1905063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos // buffer mode. 1906063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos bool queuedBuffer = false; 190741d67d7ab4da1c393497a620a116a854b3c618e7Andy McFadden status_t updateResult = mSurfaceFlingerConsumer->updateTexImage(&r, 1908ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos mFlinger->mPrimaryDispSync, &mAutoRefresh, &queuedBuffer, 1909cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mLastFrameNumberReceived); 19101585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden if (updateResult == BufferQueue::PRESENT_LATER) { 19111585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden // Producer doesn't want buffer to be displayed yet. Signal a 19121585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden // layer update so we check again at the next opportunity. 19131585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden mFlinger->signalLayerUpdate(); 19141585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden return outDirtyRegion; 1915ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza } else if (updateResult == SurfaceFlingerConsumer::BUFFER_REJECTED) { 1916ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza // If the buffer has been rejected, remove it from the shadow queue 1917ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza // and return early 1918063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 1919063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos Mutex::Autolock lock(mQueueItemLock); 1920063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos mQueueItems.removeAt(0); 1921063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos android_atomic_dec(&mQueuedFrames); 1922063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos } 1923ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza return outDirtyRegion; 192465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza } else if (updateResult != NO_ERROR || mUpdateTexImageFailed) { 192565476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // This can occur if something goes wrong when trying to create the 192665476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // EGLImage for this buffer. If this happens, the buffer has already 192765476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // been released, so we need to clean up the queue and bug out 192865476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // early. 1929063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 193065476f3332641066a99e22338bf5cf49ce4af642Dan Stoza Mutex::Autolock lock(mQueueItemLock); 193165476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mQueueItems.clear(); 193265476f3332641066a99e22338bf5cf49ce4af642Dan Stoza android_atomic_and(0, &mQueuedFrames); 193365476f3332641066a99e22338bf5cf49ce4af642Dan Stoza } 193465476f3332641066a99e22338bf5cf49ce4af642Dan Stoza 193565476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // Once we have hit this state, the shadow queue may no longer 193665476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // correctly reflect the incoming BufferQueue's contents, so even if 193765476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // updateTexImage starts working, the only safe course of action is 193865476f3332641066a99e22338bf5cf49ce4af642Dan Stoza // to continue to ignore updates. 193965476f3332641066a99e22338bf5cf49ce4af642Dan Stoza mUpdateTexImageFailed = true; 194065476f3332641066a99e22338bf5cf49ce4af642Dan Stoza 194165476f3332641066a99e22338bf5cf49ce4af642Dan Stoza return outDirtyRegion; 19421585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden } 19431585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 1944063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if (queuedBuffer) { 1945063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos // Autolock scope 1946ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza auto currentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 1947ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 19486b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza Mutex::Autolock lock(mQueueItemLock); 1949ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 1950ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza // Remove any stale buffers that have been dropped during 1951ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza // updateTexImage 1952ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza while (mQueueItems[0].mFrameNumber != currentFrameNumber) { 1953ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza mQueueItems.removeAt(0); 1954ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza android_atomic_dec(&mQueuedFrames); 1955ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza } 1956ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 19576b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza mQueueItems.removeAt(0); 19586b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza } 19596b9454d1fee0347711af1746642aa7820b1ea04dDan Stoza 1960ecc504043fddb7a75042ce402c67aedfac04d5e2Dan Stoza 19611585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden // Decrement the queued-frames count. Signal another event if we 19621585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden // have more frames pending. 1963063121849890da78b1ad7fb96c54c795de5d1fd6Pablo Ceballos if ((queuedBuffer && android_atomic_dec(&mQueuedFrames) > 1) 1964ff95aabbcc6e8606acbd7933c90eeb9b8b382a21Pablo Ceballos || mAutoRefresh) { 19651585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden mFlinger->signalLayerUpdate(); 19661585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden } 19671585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden 19681585c4d9fbbba3ba70ae625923b85cd02cb8a0fdAndy McFadden if (updateResult != NO_ERROR) { 1969a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian // something happened! 1970a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian recomputeVisibleRegions = true; 19714fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 1972a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian } 1973d343e3d5e3177806205b9452b0b43907e28afd9aMathias Agopian 1974351a513b12622781de9580b3c96fd0a8578b563bJamie Gennis // update the active buffer 1975bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden mActiveBuffer = mSurfaceFlingerConsumer->getCurrentBuffer(); 1976e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian if (mActiveBuffer == NULL) { 1977e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian // this can only happen if the very first buffer was rejected. 19784fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 1979e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian } 1980da9584dc295cc5e6d0b49a97c1e45159249d650bMathias Agopian 19814824d40a35333182c2eb3593511b9bcbecd0a943Mathias Agopian mRefreshPending = true; 1982702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian mFrameLatencyNeeded = true; 1983e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian if (oldActiveBuffer == NULL) { 19842c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // the first time we receive a buffer, we need to trigger a 19852c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian // geometry invalidation. 1986ab10c5804c250e7f392c8262f687766edec2e9f4Andy McFadden recomputeVisibleRegions = true; 19872c8207e9627fe6c7a90e31fae8d71ae49df56845Mathias Agopian } 1988702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 1989bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden Rect crop(mSurfaceFlingerConsumer->getCurrentCrop()); 1990bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden const uint32_t transform(mSurfaceFlingerConsumer->getCurrentTransform()); 1991bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden const uint32_t scalingMode(mSurfaceFlingerConsumer->getCurrentScalingMode()); 1992702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian if ((crop != mCurrentCrop) || 1993702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian (transform != mCurrentTransform) || 1994702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian (scalingMode != mCurrentScalingMode)) 1995702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian { 1996702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian mCurrentCrop = crop; 1997702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian mCurrentTransform = transform; 1998702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian mCurrentScalingMode = scalingMode; 1999ab10c5804c250e7f392c8262f687766edec2e9f4Andy McFadden recomputeVisibleRegions = true; 2000702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2001702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2002702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian if (oldActiveBuffer != NULL) { 2003e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian uint32_t bufWidth = mActiveBuffer->getWidth(); 2004e31564d8eb0ab67e167a888eccce20f5b4e4ef45Mathias Agopian uint32_t bufHeight = mActiveBuffer->getHeight(); 2005702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian if (bufWidth != uint32_t(oldActiveBuffer->width) || 2006702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian bufHeight != uint32_t(oldActiveBuffer->height)) { 2007ab10c5804c250e7f392c8262f687766edec2e9f4Andy McFadden recomputeVisibleRegions = true; 2008702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2009702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2010702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2011702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 20124125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden if (oldOpacity != isOpaque(s)) { 2013702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian recomputeVisibleRegions = true; 2014702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian } 2015702634a4dad85cfc292618ac91eda6c00f42b7c5Mathias Agopian 2016cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza mCurrentFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 2017cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2018cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // Remove any sync points corresponding to the buffer which was just 2019cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // latched 2020cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza { 2021cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza Mutex::Autolock lock(mLocalSyncPointMutex); 2022cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza auto point = mLocalSyncPoints.begin(); 2023cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza while (point != mLocalSyncPoints.end()) { 2024cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if (!(*point)->frameIsAvailable() || 2025cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza !(*point)->transactionIsApplied()) { 2026cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // This sync point must have been added since we started 2027cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza // latching. Don't drop it yet. 2028cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ++point; 2029cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza continue; 2030cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2031cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 2032cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza if ((*point)->getFrameNumber() <= mCurrentFrameNumber) { 2033cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza point = mLocalSyncPoints.erase(point); 2034cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } else { 2035cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza ++point; 2036cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2037cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2038cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza } 2039cac353808ec1048333d7fd2f3d596fb4db567aa3Dan Stoza 20404fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // FIXME: postedRegion should be dirty & bounds 20411eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian Region dirtyRegion(Rect(s.active.w, s.active.h)); 20421c8e95cf86f2182986385bc1ee85f13f425f3a3aJamie Gennis 20434fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian // transform the dirty region to window-manager space 20443dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr outDirtyRegion = (s.active.transform.transform(dirtyRegion)); 2045edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 20464fec873a98f7b4380720cd1ad006f74c8cdc73daMathias Agopian return outDirtyRegion; 2047edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 2048edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 204913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianuint32_t Layer::getEffectiveUsage(uint32_t usage) const 205013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian{ 205113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // TODO: should we do something special if mSecure is set? 205213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (mProtectedByApp) { 205313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // need a hardware-protected path to external video sink 205413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_PROTECTED; 205513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 205603414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews if (mPotentialCursor) { 205703414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews usage |= GraphicBuffer::USAGE_CURSOR; 205803414a1cfe6c1222fd7723949bd622f9cba145aaRiley Andrews } 205913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 206013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian return usage; 206113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 206213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 206313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopianvoid Layer::updateTransformHint(const sp<const DisplayDevice>& hw) const { 206413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian uint32_t orientation = 0; 206513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (!mFlinger->mDebugDisableTransformHint) { 206613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // The transform hint is used to improve performance, but we can 206713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // only have a single transform hint, it cannot 206813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // apply to all displays. 206913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const Transform& planeTransform(hw->getTransform()); 207013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = planeTransform.getOrientation(); 207113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian if (orientation & Transform::ROT_INVALID) { 207213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian orientation = 0; 207313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 207413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian } 207513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mSurfaceFlingerConsumer->setTransformHint(orientation); 207613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian} 207713127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 207813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 207913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// debugging 208013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// ---------------------------------------------------------------------------- 208113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20823e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopianvoid Layer::dump(String8& result, Colorizer& colorizer) const 20831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{ 20841eae0ee49402c39f1b08cc8fec129023f86494b7Mathias Agopian const Layer::State& s(getDrawingState()); 208513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20863e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.colorize(result, Colorizer::GREEN); 208774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 208813127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "+ %s %p (%s)\n", 208913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian getTypeId(), this, getName().string()); 20903e25fd8609b100a75721be82d1d499f0ae9083cbMathias Agopian colorizer.reset(result); 209113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 20922ca79399b933935eb1b6c0ec1f746f8c4475369cMathias Agopian s.activeTransparentRegion.dump(result, "transparentRegion"); 209313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian visibleRegion.dump(result, "visibleRegion"); 2094ee44edd0acccbf5eaa918d75737c3b65ee04fff7Dan Stoza surfaceDamageRegion.dump(result, "surfaceDamageRegion"); 209513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian sp<Client> client(mClientRef.promote()); 209613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 209774d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( " " 2098acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "layerStack=%4d, z=%9d, pos=(%g,%g), size=(%4d,%4d), " 2099acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos "crop=(%4d,%4d,%4d,%4d), finalCrop=(%4d,%4d,%4d,%4d), " 210013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "isOpaque=%1d, invalidate=%1d, " 21019e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#ifdef USE_HWC2 21029e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza "alpha=%.3f, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 21039e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#else 210413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n" 21059e56aa0fdb5f7121b9b975c6c16db103ea4d2fe9Dan Stoza#endif 210613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian " client=%p\n", 21073dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.layerStack, s.z, s.active.transform.tx(), s.active.transform.ty(), s.active.w, s.active.h, 2108b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.left, s.crop.top, 2109b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.crop.right, s.crop.bottom, 2110b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.left, s.finalCrop.top, 2111b5d3d2657bad1f012377dfacd354d3100a65768aRobert Carr s.finalCrop.right, s.finalCrop.bottom, 21124125a4ffaf374ca9c0773f256998557d3325343eAndy McFadden isOpaque(s), contentDirty, 211313127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian s.alpha, s.flags, 21143dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[0][0], s.active.transform[0][1], 21153dcabfab7ef80df5884b269fec17350a26da6f51Robert Carr s.active.transform[1][0], s.active.transform[1][1], 211613127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian client.get()); 21171b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2118a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian sp<const GraphicBuffer> buf0(mActiveBuffer); 2119a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian uint32_t w0=0, h0=0, s0=0, f0=0; 21201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian if (buf0 != 0) { 21211b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian w0 = buf0->getWidth(); 21221b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian h0 = buf0->getHeight(); 21231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian s0 = buf0->getStride(); 2124a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian f0 = buf0->format; 21251b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian } 212674d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian result.appendFormat( 21271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian " " 2128ad795baecccf239621cbffa0249c8e855296cae6Mathias Agopian "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 21296905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden " queued-frames=%d, mRefreshPending=%d\n", 2130a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian mFormat, w0, h0, s0,f0, 21316905205c8d130b6ea3a813c1b9283492ed183367Andy McFadden mQueuedFrames, mRefreshPending); 21321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian 2133bf974abe92f7495529916fe0f483f3b56e7c30e3Andy McFadden if (mSurfaceFlingerConsumer != 0) { 213474d211ae26a0257c6075a823812e40b55aa1e653Mathias Agopian mSurfaceFlingerConsumer->dump(result, " "); 2135bb641244d7d73312dc65b8e338df18b22e335107Mathias Agopian } 2136d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian} 2137d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian 2138d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::dumpFrameStats(String8& result) const { 2139d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.dumpStats(result); 214082d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian} 214182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian 2142d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::clearFrameStats() { 2143d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.clearStats(); 214425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian} 214525e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian 21466547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennisvoid Layer::logFrameStats() { 21476547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis mFrameTracker.logAndResetStats(mName); 21486547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis} 21496547ff4327aa320fbc9635668d3fc66db7dd78f6Jamie Gennis 2150d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavvoid Layer::getFrameStats(FrameStats* outStats) const { 2151d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav mFrameTracker.getStats(outStats); 2152d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav} 2153d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav 215440845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballosvoid Layer::getFenceData(String8* outName, uint64_t* outFrameNumber, 215540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos bool* outIsGlesComposition, nsecs_t* outPostedTime, 215640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos sp<Fence>* outAcquireFence, sp<Fence>* outPrevReleaseFence) const { 215740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outName = mName; 215840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outFrameNumber = mSurfaceFlingerConsumer->getFrameNumber(); 215940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos 216040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#ifdef USE_HWC2 216140845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outIsGlesComposition = mHwcLayers.count(HWC_DISPLAY_PRIMARY) ? 216240845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos mHwcLayers.at(HWC_DISPLAY_PRIMARY).compositionType == 216340845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos HWC2::Composition::Client : true; 216440845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#else 216540845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outIsGlesComposition = mIsGlesComposition; 216640845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos#endif 216740845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outPostedTime = mSurfaceFlingerConsumer->getTimestamp(); 216840845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outAcquireFence = mSurfaceFlingerConsumer->getCurrentFence(); 216940845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos *outPrevReleaseFence = mSurfaceFlingerConsumer->getPrevReleaseFence(); 217040845df1285b387bcbf8f43ac72228eee2606d80Pablo Ceballos} 217113127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian// --------------------------------------------------------------------------- 217213127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian 217313127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianLayer::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger, 217413127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian const sp<Layer>& layer) 217513127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian : mFlinger(flinger), mLayer(layer) { 2176b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian} 2177b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian 217813127d8921356dff794250e04208c3ed60b3a3dfMathias AgopianLayer::LayerCleaner::~LayerCleaner() { 217913127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian // destroy client resources 218013127d8921356dff794250e04208c3ed60b3a3dfMathias Agopian mFlinger->onLayerDestroyed(mLayer); 2181a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian} 2182a45836466c301d49d8df286b5317dfa99cb83b70Mathias Agopian 2183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 21843f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian}; // namespace android 2185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21863f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl_h_) 21873f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl/gl.h in this file" 21883f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21903f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#if defined(__gl2_h_) 21913f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#error "don't include gl2/gl2.h in this file" 21923f84483382be2d528918cc1a6fbc6a7d68e0b181Mathias Agopian#endif 2193