Layer.cpp revision da27af9832a0170f1fc40ef3f21371c4d30d21b3
1c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner/* 2c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Copyright (C) 2007 The Android Open Source Project 3c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * 4c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Licensed under the Apache License, Version 2.0 (the "License"); 5c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * you may not use this file except in compliance with the License. 6c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * You may obtain a copy of the License at 7c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * 8c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * http://www.apache.org/licenses/LICENSE-2.0 9c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * 10c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * Unless required by applicable law or agreed to in writing, software 11c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * distributed under the License is distributed on an "AS IS" BASIS, 12c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * See the License for the specific language governing permissions and 14c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner * limitations under the License. 15c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner */ 16c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 17c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner#define ATRACE_TAG ATRACE_TAG_GRAPHICS 18c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 192917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <stdlib.h> 2073d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang#include <stdint.h> 212917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <sys/types.h> 22d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi#include <math.h> 232917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 242917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <cutils/compiler.h> 252917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <cutils/native_handle.h> 262917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <cutils/properties.h> 272917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 282917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <utils/Errors.h> 292917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <utils/Log.h> 302917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <utils/StopWatch.h> 31ff71d20ff357a33c30e1e3b474e51ad47d5c5d3aJorim Jaggi#include <utils/Trace.h> 322917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 332917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <ui/GraphicBuffer.h> 342917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi#include <ui/PixelFormat.h> 352917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 363797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale#include <gui/Surface.h> 3760454dbc4d815c90ff2713e224953d6547fc3ad5Wale Ogunwale 3805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner#include "clz.h" 39f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner#include "DisplayDevice.h" 4084fa3351a21b37d02fafd634a8de65cf6cd04c4dFilip Gruszczynski#include "GLExtensions.h" 412c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner#include "Layer.h" 42f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner#include "SurfaceFlinger.h" 43ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski#include "SurfaceTextureLayer.h" 44e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 459474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale#include "DisplayHardware/HWComposer.h" 461ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr 4754977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski#define DEBUG_RESIZE 0 48737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 49737af724eb31f513386e91ee5510cc6991350937Jorim Jagginamespace android { 50737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 512c2549c5f44b712dbbf66a69d91f07d6f5336ee6Craig Mautner// --------------------------------------------------------------------------- 5205d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 5300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig MautnerLayer::Layer(SurfaceFlinger* flinger, const sp<Client>& client) 54c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner : LayerBaseClient(flinger, client), 55c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mTextureName(-1U), 5684fa3351a21b37d02fafd634a8de65cf6cd04c4dFilip Gruszczynski mQueuedFrames(0), 5784fa3351a21b37d02fafd634a8de65cf6cd04c4dFilip Gruszczynski mCurrentTransform(0), 58198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE), 59198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mCurrentOpacity(true), 60198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mRefreshPending(false), 61198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mFrameLatencyNeeded(false), 62198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mFrameLatencyOffset(0), 63198afac5ce6c8b85d5d8b374f4a7169104ef6eedChong Zhang mFormat(PIXEL_FORMAT_NONE), 64b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale mGLExtensions(GLExtensions::getInstance()), 6500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mOpaqueLayer(true), 66c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner mSecure(false), 6700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mProtectedByApp(false) 6805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner{ 6905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mCurrentCrop.makeInvalid(); 7005d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner glGenTextures(1, &mTextureName); 7100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner} 72df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 7300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautnervoid Layer::onLayerDisplayed(const sp<const DisplayDevice>& hw, 7400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner HWComposer::HWCLayerInterface* layer) { 7500af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner LayerBaseClient::onLayerDisplayed(hw, layer); 76e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (layer) { 7700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mSurfaceTexture->setReleaseFence(layer->getAndResetReleaseFenceFd()); 78b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner } 79b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner} 80e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale 81b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautnervoid Layer::onFirstRef() 82b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner{ 83b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner LayerBaseClient::onFirstRef(); 84b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner 85b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang struct FrameQueuedListener : public SurfaceTexture::FrameAvailableListener { 86b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang FrameQueuedListener(Layer* layer) : mLayer(layer) { } 87b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang private: 88eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi wp<Layer> mLayer; 89eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi virtual void onFrameAvailable() { 90eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi sp<Layer> that(mLayer.promote()); 91eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi if (that != 0) { 92eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi that->onFrameQueued(); 93eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi } 94b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner } 95b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner }; 96c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner 979474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale // Creates a custom BufferQueue for SurfaceTexture to use 989474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale sp<BufferQueue> bq = new SurfaceTextureLayer(); 999474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale mSurfaceTexture = new SurfaceTexture(mTextureName, true, 10011c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi GL_TEXTURE_EXTERNAL_OES, false, bq); 10111c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi 10211c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 10305d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mSurfaceTexture->setFrameAvailableListener(new FrameQueuedListener(this)); 104df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mSurfaceTexture->setSynchronousMode(true); 10505d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner 10605d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner#ifdef TARGET_DISABLE_TRIPLE_BUFFERING 10705d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner#warning "disabling triple buffering" 10805d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner mSurfaceTexture->setDefaultMaxBufferCount(2); 109dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner#else 110dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner mSurfaceTexture->setDefaultMaxBufferCount(3); 111dc548483ae90ba26ad9e2e2cb79f4673140edb49Craig Mautner#endif 11295da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner 11395da1087ed3c7b9983b571bc5409827ae390f15fCraig Mautner updateTransformHint(); 114ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale} 115ce14452a27acf0492d799ec88c619add3a630a88Wale Ogunwale 116ce14452a27acf0492d799ec88c619add3a630a88Wale OgunwaleLayer::~Layer() 117ce14452a27acf0492d799ec88c619add3a630a88Wale Ogunwale{ 11842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi mFlinger->deleteTextureAsync(mTextureName); 11942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi} 120baba78319b954e8e42b8ecfc03b5fedc28a6168bChong Zhang 12142625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggivoid Layer::onFrameQueued() { 12242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi android_atomic_inc(&mQueuedFrames); 123eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi mFlinger->signalLayerUpdate(); 124f347ab5eddd63dbcbb4a70a94ec0916b3db46569Chong Zhang} 12542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi 12642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi// called with SurfaceFlinger::mStateLock as soon as the layer is entered 1271ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr// in the purgatory list 1281ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carrvoid Layer::onRemoved() 1291ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr{ 1301ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr mSurfaceTexture->abandon(); 1311ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr} 1321ca6a33f36357281b3445e85d9e67cacd1a12edeRobert Carr 1330d00c2e25bf8816dbd99f4fcd5c8221e80826a95Robert Carrvoid Layer::setName(const String8& name) { 134167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang LayerBase::setName(name); 135167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang mSurfaceTexture->setName(name); 136167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang} 137167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang 138df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautnersp<ISurface> Layer::createSurface() 13905d290365f0b9ed781ffcb30b38a0c7c6e450e9dCraig Mautner{ 140c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner class BSurface : public BnSurface, public LayerCleaner { 14142625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi wp<const Layer> mOwner; 14242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi virtual sp<ISurfaceTexture> getSurfaceTexture() const { 143e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale sp<ISurfaceTexture> res; 144c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner sp<const Layer> that( mOwner.promote() ); 145c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner if (that != NULL) { 146c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner res = that->mSurfaceTexture->getBufferQueue(); 147c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 148c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner return res; 149c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner } 150d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner public: 151d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner BSurface(const sp<SurfaceFlinger>& flinger, 152d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner const sp<Layer>& layer) 153d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner : LayerCleaner(flinger, layer), mOwner(layer) { } 154d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi }; 155d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi sp<ISurface> sur(new BSurface(mFlinger, this)); 156d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi return sur; 157d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi} 158d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi 159d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggiwp<IBinder> Layer::getSurfaceTextureBinder() const 160d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi{ 161d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi return mSurfaceTexture->getBufferQueue()->asBinder(); 162d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi} 163d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi 164d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggistatus_t Layer::setBuffers( uint32_t w, uint32_t h, 165d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi PixelFormat format, uint32_t flags) 166d3ec507160eec964f687d3b03b0f126b3394e95fJorim Jaggi{ 167e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // this surfaces pixel format 168e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale PixelFormatInfo info; 169ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski status_t err = getPixelFormatInfo(format, &info); 170ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski if (err) { 171ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski ALOGE("unsupported pixelformat %d", format); 172e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale return err; 173e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } 174a6e902ec61ab1cd8f7d5df84deab6f26471c22fdWale Ogunwale 175dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi uint32_t const maxSurfaceDims = min( 176dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims()); 177899327f5cbbfb0eae5562b262ccea860c98f6bc4Jorim Jaggi 178e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // never allow a surface larger than what our underlying GL implementation 179e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale // can handle. 180e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) { 181e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h)); 182ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski return BAD_VALUE; 183ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski } 184ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski 1852a88fc31cf16b419fdd23c9841ffdbfe7af9d966Chong Zhang mFormat = format; 186b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang 187b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mSecure = (flags & ISurfaceComposerClient::eSecure) ? true : false; 188b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mProtectedByApp = (flags & ISurfaceComposerClient::eProtectedByApp) ? true : false; 189b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mOpaqueLayer = (flags & ISurfaceComposerClient::eOpaque); 190b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mCurrentOpacity = getOpacityForFormat(format); 1914846ee3cc378001128680f2a3309c7e60bfcac75Jorim Jaggi 192f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang mSurfaceTexture->setDefaultBufferSize(w, h); 193b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mSurfaceTexture->setDefaultBufferFormat(format); 194b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0)); 1954846ee3cc378001128680f2a3309c7e60bfcac75Jorim Jaggi 196dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi return NO_ERROR; 197dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi} 198dc249c4ae7c7838928f53f151bfda8a6817b8784Jorim Jaggi 199b15758ab7a6481717d0d29612e870d7241061c31Chong ZhangRect Layer::computeBufferCrop() const { 200ebcc875f10f05db7365cd8afbf4e9425221ab14dFilip Gruszczynski // Start with the SurfaceTexture's buffer crop... 2010bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski Rect crop; 202bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner if (!mCurrentCrop.isEmpty()) { 203bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner crop = mCurrentCrop; 204e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale } else if (mActiveBuffer != NULL){ 205bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner crop = Rect(mActiveBuffer->getWidth(), mActiveBuffer->getHeight()); 206bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner } else { 2070429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi crop.makeInvalid(); 2080429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi return crop; 2090429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi } 2100429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi 2110429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi // ... then reduce that in the same proportions as the window crop reduces 2120429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi // the window size. 2130429f3522bca5bb86378dd3f013f995484ddbed6Jorim Jaggi const State& s(drawingState()); 214b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale if (!s.active.crop.isEmpty()) { 215b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale // Transform the window crop to match the buffer coordinate system, 216b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale // which means using the inverse of the current transform set on the 217b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale // SurfaceTexture. 218b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale uint32_t invTransform = mCurrentTransform; 219b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale int winWidth = s.active.w; 220b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale int winHeight = s.active.h; 221b4ec0a312de422440374638195d4709cc74227e9Wale Ogunwale if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { 22242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | 22342625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi NATIVE_WINDOW_TRANSFORM_FLIP_H; 22442625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi winWidth = s.active.h; 22542625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi winHeight = s.active.w; 22642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 22742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi Rect winCrop = s.active.crop.transform(invTransform, 228eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi s.active.w, s.active.h); 229eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi 230eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi float xScale = float(crop.width()) / float(winWidth); 23142625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi float yScale = float(crop.height()) / float(winHeight); 23242625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi crop.left += int(ceilf(float(winCrop.left) * xScale)); 23342625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi crop.top += int(ceilf(float(winCrop.top) * yScale)); 23442625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi crop.right -= int(ceilf(float(winWidth - winCrop.right) * xScale)); 235eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi crop.bottom -= int(ceilf(float(winHeight - winCrop.bottom) * yScale)); 236eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi } 237eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi 2385117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang return crop; 239eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi} 240eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi 241eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggivoid Layer::setGeometry( 242eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi const sp<const DisplayDevice>& hw, 243eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi HWComposer::HWCLayerInterface& layer) 244eb88d83fc5da8ea05033c03bbb9f0d4b804ba162Jorim Jaggi{ 245741c0ba8aa84f2879c50884f53955bceb5b6e7f2Chong Zhang LayerBaseClient::setGeometry(hw, layer); 24642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi 24742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi // enable this layer 24842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi layer.setSkip(false); 24942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi 250b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang // we can't do alpha-fade with the hwc HAL 251b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang const State& s(drawingState()); 252b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang if (s.alpha < 0xFF) { 253b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang layer.setSkip(true); 254b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang } 255b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang 256b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang /* 257b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang * Transformations are applied in this order: 258b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang * 1) buffer orientation/flip/mirror 259b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang * 2) state transformation (window manager) 260b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang * 3) layer orientation (screen orientation) 261b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang * (NOTE: the matrices are multiplied in reverse order) 2625117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang */ 2635117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang 2645117e273eca0b15ef057d0c2440546799c17edf4Chong Zhang const Transform bufferOrientation(mCurrentTransform); 265b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang const Transform tr(hw->getTransform() * s.transform * bufferOrientation); 266b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang 267b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang // this gives us only the "orientation" component of the transform 268b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang const uint32_t finalTransform = tr.getOrientation(); 269e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale 270b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner // we can only handle simple transformation 2719474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale if (finalTransform & Transform::ROT_INVALID) { 27211c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi layer.setSkip(true); 273b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner } else { 274b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner layer.setTransform(finalTransform); 2759474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale } 27611c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi layer.setCrop(computeBufferCrop()); 277067e817585524aeb0fb2c5ff4444c21fadc3f0d3Jorim Jaggi} 278067e817585524aeb0fb2c5ff4444c21fadc3f0d3Jorim Jaggi 2799d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwalevoid Layer::setPerFrameData(const sp<const DisplayDevice>& hw, 2809d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale HWComposer::HWCLayerInterface& layer) { 281b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner LayerBaseClient::setPerFrameData(hw, layer); 282b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner // NOTE: buffer can be NULL if the client never drew into this 2839d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale // layer yet, or if we ran out of memory 2844a02d8133bb8bda109404c78002f80cda1f1179eWale Ogunwale layer.setBuffer(mActiveBuffer); 2859d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale} 2869d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale 2879474421a56c8bf66086a9d253013687eb5207331Wale Ogunwalevoid Layer::setAcquireFence(const sp<const DisplayDevice>& hw, 288bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner HWComposer::HWCLayerInterface& layer) { 289bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner int fenceFd = -1; 290bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner 2910689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski // TODO: there is a possible optimization here: we only need to set the 292112eb8c1f76fff6a670d7c5f85e8c3d656cd3aa8Chong Zhang // acquire fence the first time a new buffer is acquired on EACH display. 29357b6ccecc07274884b425839691fa04274b832bcFilip Gruszczynski 2940689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski if (layer.getCompositionType() == HWC_OVERLAY) { 2950689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski sp<Fence> fence = mSurfaceTexture->getCurrentFence(); 296bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner if (fence.get()) { 2979474421a56c8bf66086a9d253013687eb5207331Wale Ogunwale fenceFd = fence->dup(); 29811c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi if (fenceFd == -1) { 299b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang ALOGW("failed to dup layer fence, skipping sync: %d", errno); 30042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 301b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang } 302bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner } 303bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner layer.setAcquireFenceFd(fenceFd); 304bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner} 305f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 306f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwalevoid Layer::onDraw(const sp<const DisplayDevice>& hw, const Region& clip) const 307f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale{ 308f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale ATRACE_CALL(); 309f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 310b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner if (CC_UNLIKELY(mActiveBuffer == 0)) { 311b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner // the texture has not been created yet, this Layer has 312b660b9d8cf6b951b85a35599d636c470795e9a1aCraig Mautner // in fact never been drawn into. This happens frequently with 313f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // SurfaceView because the WindowManager can't know when the client 314f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // has drawn the first time. 315f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 3163797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale // If there is nothing under us, we paint the screen in black, otherwise 317f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // we just skip this update. 318f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 319f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // figure out if there is something below us 320f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale Region under; 321f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale const SurfaceFlinger::LayerVector& drawingLayers( 322f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale mFlinger->mDrawingState.layersSortedByZ); 323f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale const size_t count = drawingLayers.size(); 3240689ae903628f12ff073376b655b9d972533796bFilip Gruszczynski for (size_t i=0 ; i<count ; ++i) { 325f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale const sp<LayerBase>& layer(drawingLayers[i]); 32642625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi if (layer.get() == static_cast<LayerBase const*>(this)) 32742625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi break; 32842625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi under.orSelf( hw->getTransform().transform(layer->visibleRegion) ); 32942625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi } 33042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi // if not everything below us is covered, we plug the holes! 331b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang Region holes(clip.subtract(under)); 332b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang if (!holes.isEmpty()) { 333b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang clearWithOpenGL(hw, holes, 0, 0, 0, 1); 334b816b862b0c73033f1ebd8070e77fcfe33605171Chong Zhang } 335f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale return; 336f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 337f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale 338f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale status_t err = mSurfaceTexture->doGLFenceWait(); 339f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale if (err != OK) { 340f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale ALOGE("onDraw: failed waiting for fence: %d", err); 341f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // Go ahead and draw the buffer anyway; no matter what we do the screen 342f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale // is probably going to have something visibly wrong. 343f175e8a6d0d3f3ce6be94bde451e6e03f67d0705Wale Ogunwale } 3444c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 3454c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang if (!isProtected()) { 3464c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // TODO: we could be more subtle with isFixedSize() 3474c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang const bool useFiltering = getFiltering() || needsFiltering() || isFixedSize(); 3484c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang 3494c9ba52acad52f1c1087415e04b2a17614707e40Chong Zhang // Query the texture matrix given our current filtering mode. 350b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale float textureMatrix[16]; 351ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale mSurfaceTexture->setFilteringEnabled(useFiltering); 352ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale mSurfaceTexture->getTransformMatrix(textureMatrix); 353ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale 354737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // Set things up for texturing. 355ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureName); 356ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale GLenum filter = GL_NEAREST; 357ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale if (useFiltering) { 358ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale filter = GL_LINEAR; 359ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale } 360ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, filter); 361ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, filter); 362ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glMatrixMode(GL_TEXTURE); 363ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glLoadMatrixf(textureMatrix); 364ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glMatrixMode(GL_MODELVIEW); 365ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glDisable(GL_TEXTURE_2D); 366ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glEnable(GL_TEXTURE_EXTERNAL_OES); 367ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale } else { 36811c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi glBindTexture(GL_TEXTURE_2D, mFlinger->getProtectedTexName()); 36911c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi glMatrixMode(GL_TEXTURE); 370ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glLoadIdentity(); 3719d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale glMatrixMode(GL_MODELVIEW); 372eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi glDisable(GL_TEXTURE_EXTERNAL_OES); 373eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi glEnable(GL_TEXTURE_2D); 3749d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale } 3759d3de4cfb42519fefe9d8b03c38ba440bd6bc886Wale Ogunwale 376167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang drawWithOpenGL(hw, clip); 377eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi 378ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glDisable(GL_TEXTURE_EXTERNAL_OES); 379ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale glDisable(GL_TEXTURE_2D); 380eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi} 3810be2cfec46cebe44b638c2a95f613de53bb4526aAndrii Kulian 3820be2cfec46cebe44b638c2a95f613de53bb4526aAndrii Kulian// As documented in libhardware header, formats in the range 3830be2cfec46cebe44b638c2a95f613de53bb4526aAndrii Kulian// 0x100 - 0x1FF are specific to the HAL implementation, and 3840be2cfec46cebe44b638c2a95f613de53bb4526aAndrii Kulian// are known to have no alpha channel 3850be2cfec46cebe44b638c2a95f613de53bb4526aAndrii Kulian// TODO: move definition for device-specific range into 386737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi// hardware.h, instead of using hard-coded values here. 38711c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggi#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) 388ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale 38911c62e17af9096f76d4532f26cacd809c3a5ef53Jorim Jaggibool Layer::getOpacityForFormat(uint32_t format) 390eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi{ 391167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang if (HARDWARE_IS_DEVICE_FORMAT(format)) { 392ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale return true; 393ecbcadd27d1c00fddebbd2893251b05096252ee5Wale Ogunwale } 394ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang PixelFormatInfo info; 395ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang status_t err = getPixelFormatInfo(PixelFormat(format), &info); 396ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang // in case of error (unknown format), we assume no blending 397ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang return (err || info.h_alpha <= info.l_alpha); 398ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang} 399ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang 400ccc335cfc799163424d6c3cc457213cbcb4d49eeChong Zhang 4012917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggibool Layer::isOpaque() const 4025952f9aea4d0f5242d9678eb491ea7aa54734e66Wale Ogunwale{ 403737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // if we don't have a buffer yet, we're translucent regardless of the 404737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // layer's opaque flag. 4055060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi if (mActiveBuffer == 0) { 406737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi return false; 4072917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi } 4082917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi 40973d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang // if the layer has the opaque flag, then we're always opaque, 41073d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang // otherwise we use the current buffer's format. 41173d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang return mOpaqueLayer || mCurrentOpacity; 41273d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang} 41373d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang 41473d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhangbool Layer::isProtected() const 41573d4b44ce3198b0b4ac477a64d5f12a152dba549Chong Zhang{ 4162917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi const sp<GraphicBuffer>& activeBuffer(mActiveBuffer); 4172917dc4918ab2061f6cab3d181d19ea8375df9f6Jorim Jaggi return (activeBuffer != 0) && 418737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED); 419737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi} 420eb1cb927adf4b10296dfd9cdb975514d85a1116aJorim Jaggi 421167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhanguint32_t Layer::doTransaction(uint32_t flags) 422167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang{ 423167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang ATRACE_CALL(); 424167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang 425167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang const Layer::State& front(drawingState()); 426167bbfac24b1e78576b18c0522218838dfdf57bbChong Zhang const Layer::State& temp(currentState()); 427737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 428737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi const bool sizeChanged = (temp.requested.w != front.requested.w) || 429737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi (temp.requested.h != front.requested.h); 4305060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi 4315060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi if (sizeChanged) { 4325060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi // the size changed, we need to ask our client to request a new buffer 4335060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi ALOGD_IF(DEBUG_RESIZE, 4345060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi "doTransaction: geometry (layer=%p '%s'), tr=%02x, scalingMode=%d\n" 4355060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi " current={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 4365060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n" 4375060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 4385060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 4395060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi this, (const char*) getName(), mCurrentTransform, mCurrentScalingMode, 4405060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.w, temp.active.h, 4415060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.left, 4425060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.top, 4435060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.right, 4445060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.bottom, 4455060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.getWidth(), 4465060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.active.crop.getHeight(), 4475060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.w, temp.requested.h, 4485060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.left, 4495060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.top, 4505060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.right, 4515060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.bottom, 4525060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.getWidth(), 4535060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi temp.requested.crop.getHeight(), 4545060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.w, front.active.h, 4555060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.left, 4565060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.top, 4575060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.right, 4585060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.bottom, 4595060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.getWidth(), 4605060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.active.crop.getHeight(), 4615060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.w, front.requested.h, 4625060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.crop.left, 4635060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.crop.top, 4645060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.crop.right, 4655060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.crop.bottom, 4665060bd891068b78bcbe72e1d8b61efac2da02c20Jorim Jaggi front.requested.crop.getWidth(), 467737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi front.requested.crop.getHeight()); 468737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 469737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // record the new size, form this point on, when the client request 470737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // a buffer, it'll get the new size. 471737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi mSurfaceTexture->setDefaultBufferSize( 472737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi temp.requested.w, temp.requested.h); 473737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi } 474737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 475737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi if (!isFixedSize()) { 476737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 477737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi const bool resizePending = (temp.requested.w != temp.active.w) || 478737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi (temp.requested.h != temp.active.h); 479737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 480737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi if (resizePending) { 481737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // don't let LayerBase::doTransaction update the drawing state 482737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // if we have a pending resize, unless we are in fixed-size mode. 483737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // the drawing state will be updated only once we receive a buffer 484737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // with the correct size. 485737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // 486df012d5102735412d9f38513c103aa53df4bcab9Jorim Jaggi // in particular, we want to make sure the clip (which is part 487737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // of the geometry state) is latched together with the size but is 488737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi // latched immediately when no resizing is involved. 489737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 490737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi flags |= eDontUpdateGeometryState; 491737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi } 492737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi } 493737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi 494737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi return LayerBase::doTransaction(flags); 495737af724eb31f513386e91ee5510cc6991350937Jorim Jaggi} 4961bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner 4971bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautnerbool Layer::isFixedSize() const { 4981bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 4991bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner} 5001bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner 5011bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautnerbool Layer::isCropped() const { 502bc2a6dff1f0edfb2856377fbdb6378158621bd16Craig Mautner return !mCurrentCrop.isEmpty(); 5035c80c41ee0ef808e7c8234087c5538531a16f5bbJorim Jaggi} 5041bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner 5051bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner// ---------------------------------------------------------------------------- 5061bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner// pageflip handling... 5071bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner// ---------------------------------------------------------------------------- 5081bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner 5091bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautnerbool Layer::onPreComposition() { 5101bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner mRefreshPending = false; 5111bf2b873470d2ba8a4ac218da73516cc2b20aa76Craig Mautner return mQueuedFrames > 0; 5123fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale} 5136dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale 5143fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwalevoid Layer::onPostComposition() { 5153fcb4a89750d6df42f850021cd754500fc084086Wale Ogunwale if (mFrameLatencyNeeded) { 51600af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner const HWComposer& hwc = mFlinger->getHwComposer(); 51700af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner const size_t offset = mFrameLatencyOffset; 51800af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mFrameStats[offset].timestamp = mSurfaceTexture->getTimestamp(); 51900af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mFrameStats[offset].set = systemTime(); 5206dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale mFrameStats[offset].vsync = hwc.getRefreshTimestamp(HWC_DISPLAY_PRIMARY); 52100af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner mFrameLatencyOffset = (mFrameLatencyOffset + 1) % 128; 5226dfdfd6741c5a3dd8d8a49ddbd6ee5dfe2fd292dWale Ogunwale mFrameLatencyNeeded = false; 523ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 524ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale} 525ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 526ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwalebool Layer::isVisible() const { 527ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale return LayerBaseClient::isVisible() && (mActiveBuffer != NULL); 528ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale} 529ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 530ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale OgunwaleRegion Layer::latchBuffer(bool& recomputeVisibleRegions) 531ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale{ 532ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale ATRACE_CALL(); 533ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 534ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale Region outDirtyRegion; 535ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (mQueuedFrames > 0) { 536ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 537ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // if we've already called updateTexImage() without going through 538ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner // a composition step, we have to skip this layer at this point 539ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // because we cannot call updateTeximage() without a corresponding 540ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // compositionComplete() call. 541ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // we'll trigger an update in onPreComposition(). 5420bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski if (mRefreshPending) { 543ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale return outDirtyRegion; 544ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 545ac6f843c917b68ea8805711965b149a9338e3a0eCraig Mautner 546f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang // Capture the old state of the layer for comparisons later 547f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang const bool oldOpacity = isOpaque(); 548f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer; 549f66db43063e4409206f1572fa1bac4f87c431f9aChong Zhang 550967212cb542e6eeb308678367b53381bff984c31Craig Mautner // signal another event if we have more frames pending 551e4a0c5722b1d8db95dfc842d716452dbbf02c86dWale Ogunwale if (android_atomic_dec(&mQueuedFrames) > 1) { 552ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale mFlinger->signalLayerUpdate(); 55300a2725683177e97e02f474332a1b64dafa0cebaraysb.kim } 55400a2725683177e97e02f474332a1b64dafa0cebaraysb.kim 55500a2725683177e97e02f474332a1b64dafa0cebaraysb.kim struct Reject : public SurfaceTexture::BufferRejecter { 5561b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr Layer::State& front; 5571b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr Layer::State& current; 5581b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr bool& recomputeVisibleRegions; 5591b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr Reject(Layer::State& front, Layer::State& current, 5601b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr bool& recomputeVisibleRegions) 5611b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr : front(front), current(current), 5621b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr recomputeVisibleRegions(recomputeVisibleRegions) { 5631b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr } 5641b5ea72b3cd946ae27e92743339f1fcb117a0520Robert Carr 565ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale virtual bool reject(const sp<GraphicBuffer>& buf, 566ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale const BufferQueue::BufferItem& item) { 567ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (buf == NULL) { 568ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale return false; 569ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 570ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 571ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale uint32_t bufWidth = buf->getWidth(); 572ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale uint32_t bufHeight = buf->getHeight(); 573ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 574ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // check that we received a buffer of the right size 575ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // (Take the buffer's orientation into account) 576ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (item.mTransform & Transform::ROT_90) { 577ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale swap(bufWidth, bufHeight); 578ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 579ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 580ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 581ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE; 582ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (front.active != front.requested) { 583ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 584ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale if (isFixedSize || 585ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale (bufWidth == front.requested.w && 586ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale bufHeight == front.requested.h)) 587ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale { 588ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // Here we pretend the transaction happened by updating the 589ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // current and drawing states. Drawing state is only accessed 590ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // in this thread, no need to have it locked 591ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale front.active = front.requested; 592ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 593ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // We also need to update the current state so that 594ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // we don't end-up overwriting the drawing state with 595ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // this stale current state during the next transaction 596ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // 597ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // NOTE: We don't need to hold the transaction lock here 598ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // because State::active is only accessed from this thread. 599ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale current.active = front.active; 600ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 601ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale // recompute visible region 602ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale recomputeVisibleRegions = true; 603ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale } 604ddc1cb2c15549ed23dce9d416680a009fa6ae23cWale Ogunwale 605c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner ALOGD_IF(DEBUG_RESIZE, 606c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner "latchBuffer/reject: buffer (%ux%u, tr=%02x), scalingMode=%d\n" 607bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner " drawing={ active ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n" 6080bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski " requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n", 609f0ac5c87f2a4a7ee8148a7b8d02b55e439ab130cCraig Mautner bufWidth, bufHeight, item.mTransform, item.mScalingMode, 610d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.active.w, front.active.h, 611bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner front.active.crop.left, 612d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.active.crop.top, 613d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.active.crop.right, 614bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner front.active.crop.bottom, 6150bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski front.active.crop.getWidth(), 616d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.active.crop.getHeight(), 617bdc748af8ce62778d2ad15040ecdfada6e4635fdCraig Mautner front.requested.w, front.requested.h, 618d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.requested.crop.left, 619d9a22881fda77e208f54f893a804d0001d27a27eCraig Mautner front.requested.crop.top, 62000af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner front.requested.crop.right, 62104a0ea60ac7e20369e63edc4f3f8cedf8425a439Craig Mautner front.requested.crop.bottom, 62204a0ea60ac7e20369e63edc4f3f8cedf8425a439Craig Mautner front.requested.crop.getWidth(), 62300af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner front.requested.crop.getHeight()); 62400af9fe6ae0da5b716212fa754163d90b60c1ee6Craig Mautner } 625de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner 6260bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski if (!isFixedSize) { 627de4ef020ec5c3acdc90c4ba43011dda20d98d4ddCraig Mautner if (front.active.w != bufWidth || 628df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner front.active.h != bufHeight) { 629df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner // reject this buffer 630df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner return true; 631df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 632df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 63304a0ea60ac7e20369e63edc4f3f8cedf8425a439Craig Mautner return false; 634e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner } 635e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner }; 63683162a90278d9d52d8fca7ee20ba314b452261deCraig Mautner 637e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 638e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner Reject r(mDrawingState, currentState(), recomputeVisibleRegions); 639e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner 640e3119b7d353e71d1f94ddff932b722b4d285931eCraig Mautner if (mSurfaceTexture->updateTexImage(&r) < NO_ERROR) { 641c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner // something happened! 642c00204b4d14d49a0417b44ca21aee4f0d4c466e0Craig Mautner recomputeVisibleRegions = true; 643df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner return outDirtyRegion; 644df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner } 645df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner 646df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner // update the active buffer 647df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner mActiveBuffer = mSurfaceTexture->getCurrentBuffer(); 648df88d73092c62a1a3cd2b2056ca63ae2e70cc238Craig Mautner if (mActiveBuffer == NULL) { 649bc5425cdb9b302fe4c746bd79de87f56dadb9955Jorim Jaggi // this can only happen if the very first buffer was rejected. 650bc5425cdb9b302fe4c746bd79de87f56dadb9955Jorim Jaggi return outDirtyRegion; 651b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 652b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale 653e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale mRefreshPending = true; 6543797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale mFrameLatencyNeeded = true; 65565002e1d17031b76ecc67bff809494c158566408Jorim Jaggi if (oldActiveBuffer == NULL) { 65665002e1d17031b76ecc67bff809494c158566408Jorim Jaggi // the first time we receive a buffer, we need to trigger a 6573797c22ea16e932329ebffdc7e7ce09f9ecd9545Wale Ogunwale // geometry invalidation. 65865002e1d17031b76ecc67bff809494c158566408Jorim Jaggi mFlinger->invalidateHwcGeometry(); 65965002e1d17031b76ecc67bff809494c158566408Jorim Jaggi } 66065002e1d17031b76ecc67bff809494c158566408Jorim Jaggi 661b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale Rect crop(mSurfaceTexture->getCurrentCrop()); 662b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale const uint32_t transform(mSurfaceTexture->getCurrentTransform()); 663e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale const uint32_t scalingMode(mSurfaceTexture->getCurrentScalingMode()); 664e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale if ((crop != mCurrentCrop) || 665e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale (transform != mCurrentTransform) || 666e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale (scalingMode != mCurrentScalingMode)) 6679ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi { 668ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale mCurrentCrop = crop; 669ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale mCurrentTransform = transform; 6701fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi mCurrentScalingMode = scalingMode; 671ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale mFlinger->invalidateHwcGeometry(); 672b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 673b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale 674b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale if (oldActiveBuffer != NULL) { 675b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale uint32_t bufWidth = mActiveBuffer->getWidth(); 676b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale uint32_t bufHeight = mActiveBuffer->getHeight(); 677961f4858f2a401366a6691c95b702a2baac67ea1Wale Ogunwale if (bufWidth != uint32_t(oldActiveBuffer->width) || 678a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale bufHeight != uint32_t(oldActiveBuffer->height)) { 679a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale mFlinger->invalidateHwcGeometry(); 680ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale } 681ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale } 682ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale 683ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format); 68454977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski if (oldOpacity != isOpaque()) { 685ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale recomputeVisibleRegions = true; 686ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale } 687ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale 688ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 689ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 690961f4858f2a401366a6691c95b702a2baac67ea1Wale Ogunwale 69154977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski // FIXME: postedRegion should be dirty & bounds 69254977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski const Layer::State& front(drawingState()); 69354977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski Region dirtyRegion(Rect(front.active.w, front.active.h)); 694ccb6ce2dcd8b833692f6c8a4a568fb938acfe058Wale Ogunwale 69554977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski // transform the dirty region to window-manager space 69654977fe9e402f6a616c41232540efd3a45b196d7Filip Gruszczynski outDirtyRegion = (front.transform.transform(dirtyRegion)); 697ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale } 698ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale return outDirtyRegion; 699ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale} 700ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale 7010bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynskivoid Layer::dump(String8& result, char* buffer, size_t SIZE) const 702ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale{ 703ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale LayerBaseClient::dump(result, buffer, SIZE); 704ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale 705ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale sp<const GraphicBuffer> buf0(mActiveBuffer); 706ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale uint32_t w0=0, h0=0, s0=0, f0=0; 707ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale if (buf0 != 0) { 708a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale w0 = buf0->getWidth(); 709ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale h0 = buf0->getHeight(); 7101fcbab6ae5c99acab70eacc015d194e2c6ddd4e2Jorim Jaggi s0 = buf0->getStride(); 711ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale f0 = buf0->format; 712ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale } 713ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale snprintf(buffer, SIZE, 714b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale " " 715ffc11bb712343b634901fe2d0e0022e7e578dd5cWale Ogunwale "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X]," 716b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale " queued-frames=%d, mRefreshPending=%d\n", 717b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale mFormat, w0, h0, s0,f0, 718b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale mQueuedFrames, mRefreshPending); 719e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale 720ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski result.append(buffer); 721ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski 722ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski if (mSurfaceTexture != 0) { 723b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale mSurfaceTexture->dump(result, " ", buffer, SIZE); 7249ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi } 725ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski} 726ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski 727466f3216505bd039a285881e06ead631331fe368Filip Gruszczynskivoid Layer::dumpStats(String8& result, char* buffer, size_t SIZE) const 728b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale{ 729e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale LayerBaseClient::dumpStats(result, buffer, SIZE); 730b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale const size_t o = mFrameLatencyOffset; 731e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale const nsecs_t period = 7329ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi mFlinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); 7339ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi result.appendFormat("%lld\n", period); 7349ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi for (size_t i=0 ; i<128 ; i++) { 7359ea2f7ba3155a455724f64e2d6a964ad4e99dfa5Jorim Jaggi const size_t index = (o+i) % 128; 736d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi const nsecs_t time_app = mFrameStats[index].timestamp; 737d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi const nsecs_t time_set = mFrameStats[index].set; 738d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi const nsecs_t time_vsync = mFrameStats[index].vsync; 739d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi result.appendFormat("%lld\t%lld\t%lld\n", 740d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi time_app, 741d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi time_vsync, 742d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi time_set); 743d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi } 744d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi result.append("\n"); 745d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi} 746d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi 747d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggivoid Layer::clearStats() 748d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi{ 749d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi LayerBaseClient::clearStats(); 750ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski memset(mFrameStats, 0, sizeof(mFrameStats)); 751e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale} 752d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi 753e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwaleuint32_t Layer::getEffectiveUsage(uint32_t usage) const 754d434dcbfc9407baad28b6b40fea75b1b6050ad7eJorim Jaggi{ 755e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale // TODO: should we do something special if mSecure is set? 756e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale if (mProtectedByApp) { 757e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale // need a hardware-protected path to external video sink 758ef3b27224b12de71e11eade54f66742068dedf79Andrii Kulian usage |= GraphicBuffer::USAGE_PROTECTED; 759e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale } 760ef3b27224b12de71e11eade54f66742068dedf79Andrii Kulian usage |= GraphicBuffer::USAGE_HW_COMPOSER; 761e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale return usage; 762e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale} 763e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale 764e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwalevoid Layer::updateTransformHint() const { 765e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale uint32_t orientation = 0; 766e45899ae4a1414560b979168412fb3d3b575d486Wale Ogunwale if (!mFlinger->mDebugDisableTransformHint) { 767ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski // The transform hint is used to improve performance on the main 768b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale // display -- we can only have a single transform hint, it cannot 769ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski // apply to all displays. 770b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale // This is why we use the default display here. This is not an 771ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski // oversight. 772b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale sp<const DisplayDevice> hw(mFlinger->getDefaultDisplayDevice()); 773b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale const Transform& planeTransform(hw->getTransform()); 774b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale orientation = planeTransform.getOrientation(); 775ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski if (orientation & Transform::ROT_INVALID) { 776b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale orientation = 0; 777ba47f81446d2fa3120e607ddfd045144fb7d7a77Filip Gruszczynski } 778b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale } 779b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale mSurfaceTexture->setTransformHint(orientation); 78042625d1bc7ef99c4d4435e8cdebfe3eee57b8d97Jorim Jaggi} 781b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale 782b34a7ad1af54132b6b046ab8f768e0ffb81cf581Wale Ogunwale// --------------------------------------------------------------------------- 783a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale 784a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale 785a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale}; // namespace android 786a9f9b37823a5f046078594c96c262c127afdee1cWale Ogunwale