Layer.cpp revision 888c822c4cb6976aab9256c58bae9e17e3e55c5c
1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/*
2b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Copyright (C) 2007 The Android Open Source Project
3b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
4b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * Licensed under the Apache License, Version 2.0 (the "License");
5b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * you may not use this file except in compliance with the License.
6b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato * You may obtain a copy of the License at
7b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato *
8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *      http://www.apache.org/licenses/LICENSE-2.0
9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang *
10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Unless required by applicable law or agreed to in writing, software
11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * distributed under the License is distributed on an "AS IS" BASIS,
12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * See the License for the specific language governing permissions and
14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * limitations under the License.
15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */
16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define ATRACE_TAG ATRACE_TAG_GRAPHICS
18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
19b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <stdlib.h>
20b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <stdint.h>
21b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <sys/types.h>
22b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <math.h>
23b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
24b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <cutils/compiler.h>
25b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#include <cutils/native_handle.h>
26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <cutils/properties.h>
27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Errors.h>
29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Log.h>
30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/StopWatch.h>
31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <utils/Trace.h>
32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <ui/GraphicBuffer.h>
34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <ui/PixelFormat.h>
35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include <gui/Surface.h>
37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "clz.h"
39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "DisplayDevice.h"
40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "GLExtensions.h"
41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "Layer.h"
42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "SurfaceFlinger.h"
43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "SurfaceTextureLayer.h"
44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#include "DisplayHardware/HWComposer.h"
46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define DEBUG_RESIZE    0
48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangnamespace android {
50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// ---------------------------------------------------------------------------
52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing WangLayer::Layer(SurfaceFlinger* flinger,
54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        DisplayID display, const sp<Client>& client)
55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    :   LayerBaseClient(flinger, display, client),
56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mTextureName(-1U),
57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mQueuedFrames(0),
58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mCurrentTransform(0),
59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mCurrentScalingMode(NATIVE_WINDOW_SCALING_MODE_FREEZE),
60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mCurrentOpacity(true),
61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mRefreshPending(false),
62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mFrameLatencyNeeded(false),
63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mFrameLatencyOffset(0),
64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mFormat(PIXEL_FORMAT_NONE),
65b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mGLExtensions(GLExtensions::getInstance()),
66b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mOpaqueLayer(true),
67b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mSecure(false),
68b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mProtectedByApp(false)
69b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    mCurrentCrop.makeInvalid();
71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    glGenTextures(1, &mTextureName);
72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onLayerDisplayed(const DisplayDevice& hw,
75b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        HWComposer::HWCLayerInterface* layer) {
76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (layer) {
77b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mSurfaceTexture->setReleaseFence(layer->getAndResetReleaseFenceFd());
78b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
81b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onFirstRef()
82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    LayerBaseClient::onFirstRef();
84b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    struct FrameQueuedListener : public SurfaceTexture::FrameAvailableListener {
86b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        FrameQueuedListener(Layer* layer) : mLayer(layer) { }
87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    private:
88b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        wp<Layer> mLayer;
89b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        virtual void onFrameAvailable() {
90b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            sp<Layer> that(mLayer.promote());
91b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (that != 0) {
92b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                that->onFrameQueued();
93b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
94b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
95b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    };
96b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
97b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Creates a custom BufferQueue for SurfaceTexture to use
98b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    sp<BufferQueue> bq = new SurfaceTextureLayer();
99b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture = new SurfaceTexture(mTextureName, true,
100b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            GL_TEXTURE_EXTERNAL_OES, false, bq);
101b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
102b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0));
103b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    mSurfaceTexture->setFrameAvailableListener(new FrameQueuedListener(this));
104b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setSynchronousMode(true);
105b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
106b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#ifdef TARGET_DISABLE_TRIPLE_BUFFERING
107b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#warning "disabling triple buffering"
108b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setBufferCountServer(2);
109b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#else
110b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setBufferCountServer(3);
111b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato#endif
112b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
113b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
114b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoLayer::~Layer()
115b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
116b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mFlinger->deleteTextureAsync(mTextureName);
117b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
118b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
119b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onFrameQueued() {
120b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    android_atomic_inc(&mQueuedFrames);
121b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mFlinger->signalLayerUpdate();
122b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
123b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
124b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// called with SurfaceFlinger::mStateLock as soon as the layer is entered
125b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// in the purgatory list
126b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onRemoved()
127b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
128b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->abandon();
129b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
130b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
131b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::setName(const String8& name) {
132b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    LayerBase::setName(name);
133b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setName(name);
134b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
135b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
136b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratosp<ISurface> Layer::createSurface()
137b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
138b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    class BSurface : public BnSurface, public LayerCleaner {
139b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        wp<const Layer> mOwner;
140b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        virtual sp<ISurfaceTexture> getSurfaceTexture() const {
141b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            sp<ISurfaceTexture> res;
142b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            sp<const Layer> that( mOwner.promote() );
143b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            if (that != NULL) {
144b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                res = that->mSurfaceTexture->getBufferQueue();
145b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
146b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return res;
147b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
148b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    public:
149b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        BSurface(const sp<SurfaceFlinger>& flinger,
150b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                const sp<Layer>& layer)
151b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            : LayerCleaner(flinger, layer), mOwner(layer) { }
152b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    };
153b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    sp<ISurface> sur(new BSurface(mFlinger, this));
154b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return sur;
155b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
156b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
157b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangwp<IBinder> Layer::getSurfaceTextureBinder() const
158b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
159b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return mSurfaceTexture->getBufferQueue()->asBinder();
160b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
161b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
162b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratostatus_t Layer::setBuffers( uint32_t w, uint32_t h,
163b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            PixelFormat format, uint32_t flags)
164b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
165b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // this surfaces pixel format
166b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    PixelFormatInfo info;
167b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    status_t err = getPixelFormatInfo(format, &info);
168b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (err) {
169b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ALOGE("unsupported pixelformat %d", format);
170b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return err;
171b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
172b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
173b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    uint32_t const maxSurfaceDims = min(
174b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mFlinger->getMaxTextureSize(), mFlinger->getMaxViewportDims());
175b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
176b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // never allow a surface larger than what our underlying GL implementation
177b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // can handle.
178b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if ((uint32_t(w)>maxSurfaceDims) || (uint32_t(h)>maxSurfaceDims)) {
179b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ALOGE("dimensions too large %u x %u", uint32_t(w), uint32_t(h));
180b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return BAD_VALUE;
181b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
182b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
183b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mFormat = format;
184b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
185b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSecure = (flags & ISurfaceComposer::eSecure) ? true : false;
186b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mProtectedByApp = (flags & ISurfaceComposer::eProtectedByApp) ? true : false;
187b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mOpaqueLayer = (flags & ISurfaceComposer::eOpaque);
188b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mCurrentOpacity = getOpacityForFormat(format);
189b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
190b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setDefaultBufferSize(w, h);
191b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setDefaultBufferFormat(format);
192b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mSurfaceTexture->setConsumerUsageBits(getEffectiveUsage(0));
193b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
194b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return NO_ERROR;
195b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
196b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
197b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoRect Layer::computeBufferCrop() const {
198b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // Start with the SurfaceTexture's buffer crop...
199b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    Rect crop;
200b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (!mCurrentCrop.isEmpty()) {
201b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop = mCurrentCrop;
202b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    } else  if (mActiveBuffer != NULL){
203b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop = Rect(mActiveBuffer->getWidth(), mActiveBuffer->getHeight());
204b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    } else {
205b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop.makeInvalid();
206b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        return crop;
207b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
208b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
209b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // ... then reduce that in the same proportions as the window crop reduces
210b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // the window size.
211b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const State& s(drawingState());
212b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (!s.active.crop.isEmpty()) {
213b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Transform the window crop to match the buffer coordinate system,
214b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // which means using the inverse of the current transform set on the
215b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // SurfaceTexture.
216b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        uint32_t invTransform = mCurrentTransform;
217b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int winWidth = s.active.w;
218b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        int winHeight = s.active.h;
219b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
220b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
221b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    NATIVE_WINDOW_TRANSFORM_FLIP_H;
222b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            winWidth = s.active.h;
223b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            winHeight = s.active.w;
224b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
225b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Rect winCrop = s.active.crop.transform(invTransform,
226b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                s.active.w, s.active.h);
227b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
228b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        float xScale = float(crop.width()) / float(winWidth);
229b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        float yScale = float(crop.height()) / float(winHeight);
230b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop.left += int(ceilf(float(winCrop.left) * xScale));
231b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop.top += int(ceilf(float(winCrop.top) * yScale));
232b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        crop.right -= int(ceilf(float(winWidth - winCrop.right) * xScale));
233b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        crop.bottom -= int(ceilf(float(winHeight - winCrop.bottom) * yScale));
234b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
235b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
236b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return crop;
237b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
238b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
239b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setGeometry(
240b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const DisplayDevice& hw,
241b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        HWComposer::HWCLayerInterface& layer)
242b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
243b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    LayerBaseClient::setGeometry(hw, layer);
244b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
245b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // enable this layer
246b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    layer.setSkip(false);
247b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
248b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // we can't do alpha-fade with the hwc HAL
249b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const State& s(drawingState());
250b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (s.alpha < 0xFF) {
251b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        layer.setSkip(true);
252b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
253b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
254b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    /*
255b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * Transformations are applied in this order:
256b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * 1) buffer orientation/flip/mirror
257b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * 2) state transformation (window manager)
258b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato     * 3) layer orientation (screen orientation)
259b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     * (NOTE: the matrices are multiplied in reverse order)
260b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang     */
261b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
262b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const Transform bufferOrientation(mCurrentTransform);
263b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const Transform tr(hw.getTransform() * s.transform * bufferOrientation);
264b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
265b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // this gives us only the "orientation" component of the transform
266b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const uint32_t finalTransform = tr.getOrientation();
267b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
268b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // we can only handle simple transformation
269b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (finalTransform & Transform::ROT_INVALID) {
270b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        layer.setSkip(true);
271b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    } else {
272b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        layer.setTransform(finalTransform);
273b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
274b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    layer.setCrop(computeBufferCrop());
275b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
276b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
277b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setPerFrameData(const DisplayDevice& hw,
278b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        HWComposer::HWCLayerInterface& layer) {
279b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const sp<GraphicBuffer>& buffer(mActiveBuffer);
280b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // NOTE: buffer can be NULL if the client never drew into this
281b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // layer yet, or if we ran out of memory
282b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    layer.setBuffer(buffer);
283b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
284b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
285b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::setAcquireFence(const DisplayDevice& hw,
286b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        HWComposer::HWCLayerInterface& layer) {
287b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    int fenceFd = -1;
288b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
289b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // TODO: there is a possible optimization here: we only need to set the
290b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // acquire fence the first time a new buffer is acquired on EACH display.
291b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
292b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (layer.getCompositionType() == HWC_OVERLAY) {
293b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        sp<Fence> fence = mSurfaceTexture->getCurrentFence();
294b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (fence.get()) {
295b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            fenceFd = fence->dup();
296b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (fenceFd == -1) {
297b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                ALOGW("failed to dup layer fence, skipping sync: %d", errno);
298b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
299b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
300b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
301b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    layer.setAcquireFenceFd(fenceFd);
302b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
303b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
304b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::onDraw(const DisplayDevice& hw, const Region& clip) const
305b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
306b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    ATRACE_CALL();
307b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
308b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (CC_UNLIKELY(mActiveBuffer == 0)) {
309b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // the texture has not been created yet, this Layer has
310b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // in fact never been drawn into. This happens frequently with
311b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // SurfaceView because the WindowManager can't know when the client
312b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // has drawn the first time.
313b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
314b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // If there is nothing under us, we paint the screen in black, otherwise
315b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // we just skip this update.
316b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
317b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // figure out if there is something below us
318b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Region under;
319b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const SurfaceFlinger::LayerVector& drawingLayers(
320b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                mFlinger->mDrawingState.layersSortedByZ);
321b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const size_t count = drawingLayers.size();
322b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        for (size_t i=0 ; i<count ; ++i) {
323b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            const sp<LayerBase>& layer(drawingLayers[i]);
324b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (layer.get() == static_cast<LayerBase const*>(this))
325b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                break;
326b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            under.orSelf( hw.getTransform().transform(layer->visibleRegion) );
327b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
328b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // if not everything below us is covered, we plug the holes!
329b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Region holes(clip.subtract(under));
330b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (!holes.isEmpty()) {
331b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            clearWithOpenGL(hw, holes, 0, 0, 0, 1);
332b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
333b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return;
334b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
335b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
336b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // TODO: replace this with a server-side wait
337b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    sp<Fence> fence = mSurfaceTexture->getCurrentFence();
338b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (fence.get()) {
339b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        status_t err = fence->wait(Fence::TIMEOUT_NEVER);
340b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        ALOGW_IF(err != OK, "Layer::onDraw: failed waiting for fence: %d", err);
341b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Go ahead and draw the buffer anyway; no matter what we do the screen
342b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // is probably going to have something visibly wrong.
343b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
344b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
345b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (!isProtected()) {
346b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // TODO: we could be more subtle with isFixedSize()
347b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const bool useFiltering = getFiltering() || needsFiltering() || isFixedSize();
348b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
349b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Query the texture matrix given our current filtering mode.
350b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        float textureMatrix[16];
351b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mSurfaceTexture->setFilteringEnabled(useFiltering);
352b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mSurfaceTexture->getTransformMatrix(textureMatrix);
353b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
354b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // Set things up for texturing.
355b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureName);
356b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        GLenum filter = GL_NEAREST;
357b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (useFiltering) {
358b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            filter = GL_LINEAR;
359b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
360b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MAG_FILTER, filter);
361b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_MIN_FILTER, filter);
362b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glMatrixMode(GL_TEXTURE);
363b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glLoadMatrixf(textureMatrix);
364b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glMatrixMode(GL_MODELVIEW);
365b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glDisable(GL_TEXTURE_2D);
366b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glEnable(GL_TEXTURE_EXTERNAL_OES);
367b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    } else {
368b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glBindTexture(GL_TEXTURE_2D, mFlinger->getProtectedTexName());
369b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glMatrixMode(GL_TEXTURE);
370b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glLoadIdentity();
371b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glMatrixMode(GL_MODELVIEW);
372b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glDisable(GL_TEXTURE_EXTERNAL_OES);
373b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glEnable(GL_TEXTURE_2D);
374b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
375b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
376b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    drawWithOpenGL(hw, clip);
377b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
378b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    glDisable(GL_TEXTURE_EXTERNAL_OES);
379b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    glDisable(GL_TEXTURE_2D);
380b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
381b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
382b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// As documented in libhardware header, formats in the range
383b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// 0x100 - 0x1FF are specific to the HAL implementation, and
384b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// are known to have no alpha channel
385b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// TODO: move definition for device-specific range into
386b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang// hardware.h, instead of using hard-coded values here.
387b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang#define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF)
388b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
389b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::getOpacityForFormat(uint32_t format)
390b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
391b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (HARDWARE_IS_DEVICE_FORMAT(format)) {
392b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return true;
393b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
394b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    PixelFormatInfo info;
395b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    status_t err = getPixelFormatInfo(PixelFormat(format), &info);
396b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // in case of error (unknown format), we assume no blending
397b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return (err || info.h_alpha <= info.l_alpha);
398b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
399b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
400b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
401b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::isOpaque() const
402b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
403b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // if we don't have a buffer yet, we're translucent regardless of the
404b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // layer's opaque flag.
405b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (mActiveBuffer == 0) {
406b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        return false;
407b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
408b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
409b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // if the layer has the opaque flag, then we're always opaque,
410b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    // otherwise we use the current buffer's format.
411b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return mOpaqueLayer || mCurrentOpacity;
412b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
413b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
414b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::isProtected() const
415b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
416b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const sp<GraphicBuffer>& activeBuffer(mActiveBuffer);
417b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return (activeBuffer != 0) &&
418b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (activeBuffer->getUsage() & GRALLOC_USAGE_PROTECTED);
419b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
420b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
421b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratouint32_t Layer::doTransaction(uint32_t flags)
422b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
423b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    ATRACE_CALL();
424b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
425b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const Layer::State& front(drawingState());
426b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const Layer::State& temp(currentState());
427b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
428b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    const bool sizeChanged = (temp.requested.w != front.requested.w) ||
429b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                             (temp.requested.h != front.requested.h);
430b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
431b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (sizeChanged) {
432b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // the size changed, we need to ask our client to request a new buffer
433b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        ALOGD_IF(DEBUG_RESIZE,
434b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                "doTransaction: geometry (layer=%p), scalingMode=%d\n"
435b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                "  current={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
436b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n"
437b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
438b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
439b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                this, mCurrentScalingMode,
440b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.w, temp.active.h,
441b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.left,
442b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.top,
443b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.right,
444b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.bottom,
445b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.getWidth(),
446b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.active.crop.getHeight(),
447b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.w, temp.requested.h,
448b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                temp.requested.crop.left,
449b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.crop.top,
450b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.crop.right,
451b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.crop.bottom,
452b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.crop.getWidth(),
453b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.crop.getHeight(),
454b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.w, front.active.h,
455b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.left,
456b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.top,
457b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.right,
458b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.bottom,
459b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.getWidth(),
460b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.active.crop.getHeight(),
461b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.requested.w, front.requested.h,
462b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.requested.crop.left,
463b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.requested.crop.top,
464b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                front.requested.crop.right,
465b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                front.requested.crop.bottom,
466b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                front.requested.crop.getWidth(),
467b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                front.requested.crop.getHeight());
468b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
469b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // record the new size, form this point on, when the client request
470b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // a buffer, it'll get the new size.
471b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mSurfaceTexture->setDefaultBufferSize(
472b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                temp.requested.w, temp.requested.h);
473b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
474b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
475b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (!isFixedSize()) {
476b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
477b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const bool resizePending = (temp.requested.w != temp.active.w) ||
478b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                                   (temp.requested.h != temp.active.h);
479b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
480b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (resizePending) {
481b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // don't let LayerBase::doTransaction update the drawing state
482b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // if we have a pending resize, unless we are in fixed-size mode.
483b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // the drawing state will be updated only once we receive a buffer
484b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // with the correct size.
485b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            //
486b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // in particular, we want to make sure the clip (which is part
487b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            // of the geometry state) is latched together with the size but is
488b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // latched immediately when no resizing is involved.
489b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
490b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            flags |= eDontUpdateGeometryState;
491b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
492b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
493b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
494b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return LayerBase::doTransaction(flags);
495b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
496b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
497b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangbool Layer::isFixedSize() const {
498b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return mCurrentScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
499b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
500b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
501b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::isCropped() const {
502b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return !mCurrentCrop.isEmpty();
503b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
504b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
505b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// ----------------------------------------------------------------------------
506b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// pageflip handling...
507b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// ----------------------------------------------------------------------------
508b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
509b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratobool Layer::onPreComposition() {
510b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    mRefreshPending = false;
511b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return mQueuedFrames > 0;
512b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
513b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
514b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::onPostComposition() {
515b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (mFrameLatencyNeeded) {
516b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const HWComposer& hwc = mFlinger->getHwComposer();
517b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const size_t offset = mFrameLatencyOffset;
518b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameStats[offset].timestamp = mSurfaceTexture->getTimestamp();
519b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameStats[offset].set = systemTime();
520b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameStats[offset].vsync = hwc.getRefreshTimestamp();
521b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameLatencyOffset = (mFrameLatencyOffset + 1) % 128;
522b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameLatencyNeeded = false;
523b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
524b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
525b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
526b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe OnoratoRegion Layer::latchBuffer(bool& recomputeVisibleRegions)
527b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
528b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    ATRACE_CALL();
529b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
530b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    Region outDirtyRegion;
531b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (mQueuedFrames > 0) {
532b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
533b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // if we've already called updateTexImage() without going through
534b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // a composition step, we have to skip this layer at this point
535b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // because we cannot call updateTeximage() without a corresponding
536b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // compositionComplete() call.
537b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // we'll trigger an update in onPreComposition().
538b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (mRefreshPending) {
539b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return outDirtyRegion;
540b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
541b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
542b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // Capture the old state of the layer for comparisons later
543b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const bool oldOpacity = isOpaque();
544b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        sp<GraphicBuffer> oldActiveBuffer = mActiveBuffer;
545b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
546b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // signal another event if we have more frames pending
547b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (android_atomic_dec(&mQueuedFrames) > 1) {
548b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mFlinger->signalLayerUpdate();
549b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
550b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
551b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        struct Reject : public SurfaceTexture::BufferRejecter {
552b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Layer::State& front;
553b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            Layer::State& current;
554b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            bool& recomputeVisibleRegions;
555b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            Reject(Layer::State& front, Layer::State& current,
556b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    bool& recomputeVisibleRegions)
557b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                : front(front), current(current),
558b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                  recomputeVisibleRegions(recomputeVisibleRegions) {
559b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
560b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
561b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            virtual bool reject(const sp<GraphicBuffer>& buf,
562b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    const BufferQueue::BufferItem& item) {
563b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (buf == NULL) {
564b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    return false;
565b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
566b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
567b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                uint32_t bufWidth  = buf->getWidth();
568b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                uint32_t bufHeight = buf->getHeight();
569b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
570b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // check that we received a buffer of the right size
571b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                // (Take the buffer's orientation into account)
572b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (item.mTransform & Transform::ROT_90) {
573b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    swap(bufWidth, bufHeight);
574b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
575b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
576b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
577b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                bool isFixedSize = item.mScalingMode != NATIVE_WINDOW_SCALING_MODE_FREEZE;
578b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (front.active != front.requested) {
579b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
580b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    if (isFixedSize ||
581b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            (bufWidth == front.requested.w &&
582b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                             bufHeight == front.requested.h))
583b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    {
584b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // Here we pretend the transaction happened by updating the
585b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // current and drawing states. Drawing state is only accessed
586b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // in this thread, no need to have it locked
587b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        front.active = front.requested;
588b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
589b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // We also need to update the current state so that
590b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // we don't end-up overwriting the drawing state with
591b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // this stale current state during the next transaction
592b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        //
593b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        // NOTE: We don't need to hold the transaction lock here
594b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                        // because State::active is only accessed from this thread.
595b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        current.active = front.active;
596b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
597b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // recompute visible region
598b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        recomputeVisibleRegions = true;
599b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
600b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
601b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    ALOGD_IF(DEBUG_RESIZE,
602b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            "lockPageFlip: (layer=%p), buffer (%ux%u, tr=%02x), scalingMode=%d\n"
603b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            "  drawing={ active   ={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }\n"
604b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            "            requested={ wh={%4u,%4u} crop={%4d,%4d,%4d,%4d} (%4d,%4d) }}\n",
605b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            this, bufWidth, bufHeight, item.mTransform, item.mScalingMode,
606b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.w, front.active.h,
607b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.left,
608b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.top,
609b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.right,
610b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.bottom,
611b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.getWidth(),
612b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.active.crop.getHeight(),
613b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.requested.w, front.requested.h,
614b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.requested.crop.left,
615b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.requested.crop.top,
616b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                            front.requested.crop.right,
617b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                            front.requested.crop.bottom,
618b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.requested.crop.getWidth(),
619b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                            front.requested.crop.getHeight());
620b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
621b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
622b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                if (!isFixedSize) {
623b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    if (front.active.w != bufWidth ||
624b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        front.active.h != bufHeight) {
625b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        // reject this buffer
626b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                        return true;
627b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                    }
628b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                }
629b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato                return false;
630b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            }
631b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        };
632b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
633b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
634b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Reject r(mDrawingState, currentState(), recomputeVisibleRegions);
635b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
636b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // XXX: not sure if setTransformHint belongs here
637b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // it should only be needed when the main screen orientation changes
638b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mSurfaceTexture->setTransformHint(getTransformHint());
639b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
6409f606f95f03a75961498803e24bee6799a7c0885Ying Wang        if (mSurfaceTexture->updateTexImage(&r) < NO_ERROR) {
641b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // something happened!
642b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            recomputeVisibleRegions = true;
643b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return outDirtyRegion;
644b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
645b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
646b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // update the active buffer
647b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mActiveBuffer = mSurfaceTexture->getCurrentBuffer();
648b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (mActiveBuffer == NULL) {
649b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            // this can only happen if the very first buffer was rejected.
650b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            return outDirtyRegion;
651b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
652b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
653b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mRefreshPending = true;
654b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        mFrameLatencyNeeded = true;
655b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (oldActiveBuffer == NULL) {
656b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             // the first time we receive a buffer, we need to trigger a
657b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             // geometry invalidation.
658b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato             mFlinger->invalidateHwcGeometry();
659b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato         }
660b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
661b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        Rect crop(mSurfaceTexture->getCurrentCrop());
662b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const uint32_t transform(mSurfaceTexture->getCurrentTransform());
663b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const uint32_t scalingMode(mSurfaceTexture->getCurrentScalingMode());
664b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if ((crop != mCurrentCrop) ||
665b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (transform != mCurrentTransform) ||
666b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            (scalingMode != mCurrentScalingMode))
667b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        {
668b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mCurrentCrop = crop;
669b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mCurrentTransform = transform;
670b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mCurrentScalingMode = scalingMode;
671b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            mFlinger->invalidateHwcGeometry();
672b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
673b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
674b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (oldActiveBuffer != NULL) {
675b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            uint32_t bufWidth  = mActiveBuffer->getWidth();
676b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            uint32_t bufHeight = mActiveBuffer->getHeight();
677b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            if (bufWidth != uint32_t(oldActiveBuffer->width) ||
678b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                bufHeight != uint32_t(oldActiveBuffer->height)) {
679b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                mFlinger->invalidateHwcGeometry();
680b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            }
681b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
682b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
683b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mCurrentOpacity = getOpacityForFormat(mActiveBuffer->format);
684b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        if (oldOpacity != isOpaque()) {
685b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            recomputeVisibleRegions = true;
686b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        }
687b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
688b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
689b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        glTexParameterx(GL_TEXTURE_EXTERNAL_OES, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
690b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
691b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // FIXME: postedRegion should be dirty & bounds
692b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const Layer::State& front(drawingState());
693b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        Region dirtyRegion(Rect(front.active.w, front.active.h));
694b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
695b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        // transform the dirty region to window-manager space
696b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        outDirtyRegion = (front.transform.transform(dirtyRegion));
697b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
698b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return outDirtyRegion;
699b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
700b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
701b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::dump(String8& result, char* buffer, size_t SIZE) const
702b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
703b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    LayerBaseClient::dump(result, buffer, SIZE);
704b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
705b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    sp<const GraphicBuffer> buf0(mActiveBuffer);
706b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    uint32_t w0=0, h0=0, s0=0, f0=0;
707b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (buf0 != 0) {
708b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        w0 = buf0->getWidth();
709b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        h0 = buf0->getHeight();
710b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        s0 = buf0->getStride();
711b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        f0 = buf0->format;
712b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
713b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    snprintf(buffer, SIZE,
714b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            "      "
715b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            "format=%2d, activeBuffer=[%4ux%4u:%4u,%3X],"
716b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            " transform-hint=0x%02x, queued-frames=%d, mRefreshPending=%d\n",
717b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            mFormat, w0, h0, s0,f0,
718b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang            getTransformHint(), mQueuedFrames, mRefreshPending);
719b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
720b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    result.append(buffer);
721b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
722b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    if (mSurfaceTexture != 0) {
723b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        mSurfaceTexture->dump(result, "            ", buffer, SIZE);
724b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    }
725b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
726b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
727b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangvoid Layer::dumpStats(String8& result, char* buffer, size_t SIZE) const
728b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{
729b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    LayerBaseClient::dumpStats(result, buffer, SIZE);
730b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const size_t o = mFrameLatencyOffset;
731b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const DisplayDevice& hw(mFlinger->getDefaultDisplayDevice());
732b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    const nsecs_t period = mFlinger->getHwComposer().getRefreshPeriod();
733b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    result.appendFormat("%lld\n", period);
734b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    for (size_t i=0 ; i<128 ; i++) {
735b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const size_t index = (o+i) % 128;
736b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const nsecs_t time_app   = mFrameStats[index].timestamp;
737b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const nsecs_t time_set   = mFrameStats[index].set;
738b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        const nsecs_t time_vsync = mFrameStats[index].vsync;
739b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang        result.appendFormat("%lld\t%lld\t%lld\n",
740b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                time_app,
741b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                time_vsync,
742b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang                time_set);
743b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
744b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    result.append("\n");
745b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
746b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
747b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratovoid Layer::clearStats()
748b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
749b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    LayerBaseClient::clearStats();
750b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    memset(mFrameStats, 0, sizeof(mFrameStats));
751b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
752b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
753b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onoratouint32_t Layer::getEffectiveUsage(uint32_t usage) const
754b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato{
755b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    // TODO: should we do something special if mSecure is set?
756b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (mProtectedByApp) {
757b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // need a hardware-protected path to external video sink
758b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        usage |= GraphicBuffer::USAGE_PROTECTED;
759b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
760b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    usage |= GraphicBuffer::USAGE_HW_COMPOSER;
761b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    return usage;
762b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}
763b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang
764b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wanguint32_t Layer::getTransformHint() const {
765b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    uint32_t orientation = 0;
766b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    if (!mFlinger->mDebugDisableTransformHint) {
767b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // The transform hint is used to improve performance on the main
768b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // display -- we can only have a single transform hint, it cannot
769b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // apply to all displays.
770b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // This is why we use the default display here. This is not an
771b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        // oversight.
772b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const DisplayDevice& hw(mFlinger->getDefaultDisplayDevice());
773b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        const Transform& planeTransform(hw.getTransform());
774b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        orientation = planeTransform.getOrientation();
775b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        if (orientation & Transform::ROT_INVALID) {
776b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato            orientation = 0;
777b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato        }
778b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato    }
779b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang    return orientation;
780b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang}
781b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
782b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato// ---------------------------------------------------------------------------
783b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
784b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato
785b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato}; // namespace android
786b72c5c2e5482cf10117b2b25f642f7616b2326c3Joe Onorato