LayerBase.cpp revision 1b03149f3533db04e72e088d3fdd09d0087ca594
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
23310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IPCThreadState.h>
24310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IServiceManager.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/hardware.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
32db403e8ff0d7727015e1a5009bab20eb7ec205bcMathias Agopian#include "Client.h"
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
351b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian#include "DisplayHardware.h"
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1;
42f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : dpy(display), contentDirty(false),
45f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian      sequence(uint32_t(android_atomic_inc(&sSequence))),
46a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      mFlinger(flinger), mFiltering(false),
47a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian      mNeedsFiltering(false),
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
498d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis      mPlaneOrientation(0),
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
5199ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false)
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.active.w = w;
7793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.active.h = h;
7893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.active.crop.makeInvalid();
7993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.z = 0;
8093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.alpha = 0xFF;
8193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.flags = layerFlags;
8293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.sequence = 0;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
8493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.requested = mCurrentState.active;
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
90ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
11041b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
12793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    if (mCurrentState.requested.w == w && mCurrentState.requested.h == h)
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
12993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.requested.w = w;
13093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    mCurrentState.requested.h = h;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
164f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisbool LayerBase::setCrop(const Rect& crop) {
165b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian    if (mCurrentState.requested.crop == crop)
166f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return false;
167f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mCurrentState.sequence++;
168b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian    mCurrentState.requested.crop = crop;
169f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    requestTransaction();
170f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return true;
171f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19305cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian    // always set active to requested, unless we're asked not to
19405cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian    // this is used by Layer, which special cases resizes.
19505cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian    if (flags & eDontUpdateGeometryState)  {
19605cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian    } else {
1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
198b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian        editTemp.active = temp.requested;
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
20005cec9d1275fd939c2d1aec235dca2bdb8edef63Mathias Agopian
201b30c415539813b96a831b75d07f3d12aef1aeab7Mathias Agopian    if (front.active != temp.active) {
2026656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2036656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
210a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
211733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        // we may use linear filtering, if the matrix scales us
212733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        const uint8_t type = temp.transform.getType();
213733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        mNeedsFiltering = (!temp.transform.preserveRects() ||
214733189d408e13b54fd70971b265244367efd0f51Mathias Agopian                (type >= Transform::SCALE));
215a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
218ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2221b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::validateVisibility(const Transform& planeTransform, const DisplayHardware& hw)
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
227ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const uint32_t hw_h = hw.getHeight();
22893ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    const Rect& crop(s.active.crop);
229ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
23093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    Rect win(s.active.w, s.active.h);
231f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!crop.isEmpty()) {
232f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        win.intersect(crop, &win);
233f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
234f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian
235f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    mNumVertices = 4;
236f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[0], win.left,  win.top);
237f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[1], win.left,  win.bottom);
238f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[2], win.right, win.bottom);
239f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[3], win.right, win.top);
240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    for (size_t i=0 ; i<4 ; i++)
241ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian        mVertices[i][1] = hw_h - mVertices[i][1];
242ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
24399ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(transformed)) {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
2608d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis    mPlaneOrientation = planeTransform.getOrientation();
261d992db3827016388e8069f5793b031153d423501Mathias Agopian    mTransform = tr;
262f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mTransformedBounds = tr.transform(win);
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26599ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) {
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
26999ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        const Transform& planeTransform, Region& outDirtyRegion) {
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2723e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopianvoid LayerBase::setGeometry(HWComposer::HWCLayerInterface& layer)
273a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{
2743e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    layer.setDefaultState();
275a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
276a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // this gives us only the "orientation" component of the transform
277a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const State& s(drawingState());
278a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const uint32_t finalTransform = s.transform.getOrientation();
279a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // we can only handle simple transformation
280a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (finalTransform & Transform::ROT_INVALID) {
2813e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian        layer.setTransform(0);
282a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    } else {
2833e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian        layer.setTransform(finalTransform);
284a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
285a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
286a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (!isOpaque()) {
2873e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian        layer.setBlending(mPremultipliedAlpha ?
2883e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian                HWC_BLENDING_PREMULT :
2893e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian                HWC_BLENDING_COVERAGE);
290a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
291a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // scaling is already applied in mTransformedBounds
2933e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    layer.setFrame(mTransformedBounds);
2943e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    layer.setVisibleRegionScreen(visibleRegionScreen);
2953e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    layer.setCrop(mTransformedBounds.getBounds());
2963e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian}
2973e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian
2983e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopianvoid LayerBase::setPerFrameData(HWComposer::HWCLayerInterface& layer) {
2993e8b853d67c737abdb363f9c978e7d83eac4d888Mathias Agopian    layer.setBuffer(0);
300c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
301c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
302a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering)
303a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
304a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFiltering = filtering;
305a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
306a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
307a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const
308a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
309a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return mFiltering;
310a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
311a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
3121b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::draw(const DisplayHardware& hw, const Region& clip) const
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
3141b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    onDraw(hw, clip);
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3171b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::drawForSreenShot(const DisplayHardware& hw)
31874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{
319a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(true);
3201b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    onDraw( hw, Region(hw.bounds()) );
321a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(false);
32274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
32374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
3241b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::clearWithOpenGL(const DisplayHardware& hw, const Region& clip,
3251b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian        GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha) const
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
328010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
3290a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
330c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_TEXTURE_EXTERNAL_OES);
331a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    glDisable(GL_TEXTURE_2D);
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
33320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
33478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
335f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3381b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::clearWithOpenGL(const DisplayHardware& hw, const Region& clip) const
33929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
3401b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopian    clearWithOpenGL(hw, clip, 0,0,0,0);
34129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
34229aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3431b03149f3533db04e72e088d3fdd09d0087ca594Mathias Agopianvoid LayerBase::drawWithOpenGL(const DisplayHardware& hw, const Region& clip) const
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
34999ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(s.alpha < 0xFF)) {
35049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
35149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
35249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
35449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
35849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
36078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
36149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
362a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (!isOpaque()) {
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
370b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    struct TexCoords {
371b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat u;
372b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat v;
37378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
37478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
37593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    Rect crop(s.active.w, s.active.h);
37693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    if (!s.active.crop.isEmpty()) {
37793ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian        crop = s.active.crop;
378f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
37993ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    GLfloat left = GLfloat(crop.left) / GLfloat(s.active.w);
38093ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    GLfloat top = GLfloat(crop.top) / GLfloat(s.active.h);
38193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    GLfloat right = GLfloat(crop.right) / GLfloat(s.active.w);
38293ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian    GLfloat bottom = GLfloat(crop.bottom) / GLfloat(s.active.h);
383f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
384b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    TexCoords texCoords[4];
385f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[0].u = left;
386f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[0].v = top;
387f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[1].u = left;
388f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[1].v = bottom;
389f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[2].u = right;
390f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[2].v = bottom;
391f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[3].u = right;
392f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[3].v = top;
393f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    for (int i = 0; i < 4; i++) {
394f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        texCoords[i].v = 1.0f - texCoords[i].v;
395f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
39878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
39978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
400f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices);
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
403c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_BLEND);
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4061b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4071b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4081b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
409c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
410c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    snprintf(buffer, SIZE,
411c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            "+ %s %p (%s)\n",
412c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            getTypeId(), this, getName().string());
413c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    result.append(buffer);
414c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
41582d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    s.transparentRegion.dump(result, "transparentRegion");
41682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    transparentRegionScreen.dump(result, "transparentRegionScreen");
41782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    visibleRegionScreen.dump(result, "visibleRegionScreen");
418c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
4191b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4201b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
42193ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            "z=%9d, pos=(%g,%g), size=(%4d,%4d), crop=(%4d,%4d,%4d,%4d), "
422a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, "
4231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
42493ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            s.z, s.transform.tx(), s.transform.ty(), s.active.w, s.active.h,
42593ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            s.active.crop.left, s.active.crop.top,
42693ffb86b909005bbee4993fc9053f017466311c7Mathias Agopian            s.active.crop.right, s.active.crop.bottom,
427a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            isOpaque(), needsDithering(), contentDirty,
4281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4301b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4311b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
43354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
43425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const {
43548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBase::dump(result, scratch, size);
43648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
43748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
43825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const {
43925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
44025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
44125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() {
44282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
44348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
446631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4472e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
44996f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
450a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    : LayerBase(flinger, display),
451a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mHasSurface(false),
452a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mClientRef(client),
453948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
455076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
459b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
46096f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
461b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
465a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface()
466a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
467a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    class BSurface : public BnSurface, public LayerCleaner {
468a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; }
469a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    public:
470a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        BSurface(const sp<SurfaceFlinger>& flinger,
471a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                const sp<LayerBaseClient>& layer)
472a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            : LayerCleaner(flinger, layer) { }
473a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    };
474a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> sur(new BSurface(mFlinger, this));
475a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return sur;
476a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
477a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
478a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface()
479076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
480a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> s;
481076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
482a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
483a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
484a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian            "LayerBaseClient::getSurface() has already been called");
485a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
486a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mHasSurface = true;
487a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    s = createSurface();
488a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mClientSurfaceBinder = s->asBinder();
489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
490076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
491076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
4920d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const {
4930d1561275e80073807ac04728951782d943f8882Mathias Agopian    return mClientSurfaceBinder;
4940d1561275e80073807ac04728951782d943f8882Mathias Agopian}
4950d1561275e80073807ac04728951782d943f8882Mathias Agopian
496582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
497582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    return 0;
498582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
499582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
5001b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5011b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5021b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5031b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
504b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5051b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
50696f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
50796f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5081b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5091b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5111b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
51248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
51348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const
51448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{
51548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBaseClient::dump(result, scratch, size);
51648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
51748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
521a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const sp<LayerBaseClient>& layer)
522a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    : mFlinger(flinger), mLayer(layer) {
523076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
524076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
525a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() {
5269a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
527a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFlinger->destroySurface(mLayer);
528b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
529b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
533