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