LayerBase.cpp revision f15a83f5814219c167f87cb8aaea622fc8493499
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"
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1;
41f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : dpy(display), contentDirty(false),
44f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian      sequence(uint32_t(android_atomic_inc(&sSequence))),
45a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian      mFlinger(flinger), mFiltering(false),
46a2f4e56fec0fb36c4a370eb23d6e9dc57f250b59Mathias Agopian      mNeedsFiltering(false),
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
488d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis      mPlaneOrientation(0),
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
5099ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
877e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
96f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mCurrentState.crop.makeInvalid();
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12241b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1397e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1427e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisbool LayerBase::setCrop(const Rect& crop) {
177f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (mCurrentState.crop == crop)
178f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        return false;
179f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mCurrentState.sequence++;
180f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mCurrentState.crop = crop;
181f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    requestTransaction();
182f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    return true;
183f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis}
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
2067e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
2077e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2087e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2107e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2126656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2136656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2146656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2156656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2166656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2177e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
223733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        // we may use linear filtering, if the matrix scales us
224733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        const uint8_t type = temp.transform.getType();
225733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        mNeedsFiltering = (!temp.transform.preserveRects() ||
226733189d408e13b54fd70971b265244367efd0f51Mathias Agopian                (type >= Transform::SCALE));
227a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
228a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
230ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
239ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const uint32_t hw_h = hw.getHeight();
241f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    const Rect& crop(s.crop);
242ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
243f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect win(s.w, s.h);
244f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!crop.isEmpty()) {
245f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        win.intersect(crop, &win);
246f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
247f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian
248f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    mNumVertices = 4;
249f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[0], win.left,  win.top);
250f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[1], win.left,  win.bottom);
251f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[2], win.right, win.bottom);
252f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    tr.transform(mVertices[3], win.right, win.top);
253ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    for (size_t i=0 ; i<4 ; i++)
254ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian        mVertices[i][1] = hw_h - mVertices[i][1];
255ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
25699ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(transformed)) {
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
2738d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis    mPlaneOrientation = planeTransform.getOrientation();
274d992db3827016388e8069f5793b031153d423501Mathias Agopian    mTransform = tr;
275f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    mTransformedBounds = tr.transform(win);
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) {
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
28299ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        const Transform& planeTransform, Region& outDirtyRegion) {
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
285a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl)
286a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{
287a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
288a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->hints = 0;
289a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->flags = HWC_SKIP_LAYER;
290a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->transform = 0;
291a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->blending = HWC_BLENDING_NONE;
292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
293a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // this gives us only the "orientation" component of the transform
294a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const State& s(drawingState());
295a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const uint32_t finalTransform = s.transform.getOrientation();
296a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // we can only handle simple transformation
297a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (finalTransform & Transform::ROT_INVALID) {
298a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->flags = HWC_SKIP_LAYER;
299a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    } else {
300a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->transform = finalTransform;
301a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
302a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
303a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (!isOpaque()) {
304a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->blending = mPremultipliedAlpha ?
305a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE;
306a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
307a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
308a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // scaling is already applied in mTransformedBounds
309a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.left   = mTransformedBounds.left;
310a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.top    = mTransformedBounds.top;
311a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.right  = mTransformedBounds.right;
312a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.bottom = mTransformedBounds.bottom;
313a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->visibleRegionScreen.rects =
314a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian            reinterpret_cast<hwc_rect_t const *>(
315a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                    visibleRegionScreen.getArray(
316a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                            &hwcl->visibleRegionScreen.numRects));
317a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
318a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.left   = 0;
319a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.top    = 0;
320a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.right  = mTransformedBounds.width();
321a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.bottom = mTransformedBounds.height();
322a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
323a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
324c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) {
325c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
326c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->handle = NULL;
327c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
328c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
329a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering)
330a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
331a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFiltering = filtering;
332a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
333a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
334a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const
335a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
336a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return mFiltering;
337a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
338a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
339bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawForSreenShot()
34574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{
34674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
347a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(true);
34874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    onDraw( Region(hw.bounds()) );
349a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(false);
35074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
35174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
352010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
353010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
354010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
358010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
3590a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
360c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_TEXTURE_EXTERNAL_OES);
361a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    glDisable(GL_TEXTURE_2D);
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
36320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
36478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
365f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices);
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
36929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
37029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
37129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
37229aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip) const
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
377edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
38099ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(s.alpha < 0xFF)) {
38149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
38249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
38349753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
38549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
38949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
39178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
39249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
393a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (!isOpaque()) {
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
401b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    struct TexCoords {
402b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat u;
403b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat v;
40478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
40578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
406f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    Rect crop(s.w, s.h);
407f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    if (!s.crop.isEmpty()) {
408f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        crop = s.crop;
409f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
410f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    GLfloat left = GLfloat(crop.left) / GLfloat(s.w);
411f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    GLfloat top = GLfloat(crop.top) / GLfloat(s.h);
412f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    GLfloat right = GLfloat(crop.right) / GLfloat(s.w);
413f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    GLfloat bottom = GLfloat(crop.bottom) / GLfloat(s.h);
414f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis
415b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    TexCoords texCoords[4];
416f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[0].u = left;
417f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[0].v = top;
418f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[1].u = left;
419f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[1].v = bottom;
420f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[2].u = right;
421f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[2].v = bottom;
422f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[3].u = right;
423f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    texCoords[3].v = top;
424f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    for (int i = 0; i < 4; i++) {
425f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis        texCoords[i].v = 1.0f - texCoords[i].v;
426f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    }
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
42978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
431f74e8e0602100e048c13ea262f0c19c3b8738b6fMathias Agopian    glDrawArrays(GL_TRIANGLE_FAN, 0, mNumVertices);
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
434c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_BLEND);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4371b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4381b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4391b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
440c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
441c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    snprintf(buffer, SIZE,
442c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            "+ %s %p (%s)\n",
443c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            getTypeId(), this, getName().string());
444c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    result.append(buffer);
445c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
44682d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    s.transparentRegion.dump(result, "transparentRegion");
44782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    transparentRegionScreen.dump(result, "transparentRegionScreen");
44882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    visibleRegionScreen.dump(result, "visibleRegionScreen");
449c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
4501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
45241b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            "z=%9d, pos=(%g,%g), size=(%4d,%4d), "
453a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, "
4541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
45522da60c3e64cd57535cbba063c07127814a2b52fMathias Agopian            s.z, s.transform.tx(), s.transform.ty(), s.w, s.h,
456a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            isOpaque(), needsDithering(), contentDirty,
4571b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
46254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
46325e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const {
46448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBase::dump(result, scratch, size);
46548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
46648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
46725e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const {
46825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
46925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
47025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() {
47182d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
47248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
475631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4762e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
47896f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
479a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    : LayerBase(flinger, display),
480a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mHasSurface(false),
481a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mClientRef(client),
482948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
488b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
48996f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
490b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
494a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface()
495a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
496a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    class BSurface : public BnSurface, public LayerCleaner {
497a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; }
498a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    public:
499a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        BSurface(const sp<SurfaceFlinger>& flinger,
500a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                const sp<LayerBaseClient>& layer)
501a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            : LayerCleaner(flinger, layer) { }
502a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    };
503a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> sur(new BSurface(mFlinger, this));
504a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return sur;
505a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
506a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
507a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface()
508076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
509a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> s;
510076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
511a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
512a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
513a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian            "LayerBaseClient::getSurface() has already been called");
514a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
515a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mHasSurface = true;
516a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    s = createSurface();
517a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mClientSurfaceBinder = s->asBinder();
518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5210d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const {
5220d1561275e80073807ac04728951782d943f8882Mathias Agopian    return mClientSurfaceBinder;
5230d1561275e80073807ac04728951782d943f8882Mathias Agopian}
5240d1561275e80073807ac04728951782d943f8882Mathias Agopian
525582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
526582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    return 0;
527582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
528582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
5291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5301b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5311b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
533b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
53596f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
53696f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5371b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5381b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5391b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5401b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
54148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
54248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const
54348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{
54448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBaseClient::dump(result, scratch, size);
54548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
54648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
549a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
550a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const sp<LayerBaseClient>& layer)
551a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    : mFlinger(flinger), mLayer(layer) {
552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
553076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
554a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() {
5559a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
556a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFlinger->destroySurface(mLayer);
557b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
558b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
561edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
562