LayerBase.cpp revision c95dbdc236acf002b5f8aed8c8a9e43047fc75b5
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),
46f9abeb956fb95682d77005ea0dc506a805f52a04Mathias Agopian      mNeedsFiltering(false), mInOverlay(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);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
12141b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianbool LayerBase::setPosition(float x, float y) {
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1387e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1407e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2036656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2087e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
213a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
214733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        // we may use linear filtering, if the matrix scales us
215733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        const uint8_t type = temp.transform.getType();
216733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        mNeedsFiltering = (!temp.transform.preserveRects() ||
217733189d408e13b54fd70971b265244367efd0f51Mathias Agopian                (type >= Transform::SCALE));
218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
221ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
230ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
231ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const uint32_t hw_h = hw.getHeight();
232ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
233cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
234cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
239ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    for (size_t i=0 ; i<4 ; i++)
240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian        mVertices[i][1] = hw_h - mVertices[i][1];
241ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
24299ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(transformed)) {
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
2598d91b425078083d0e4967dcd8d669d9f7196123aJamie Gennis    mPlaneOrientation = planeTransform.getOrientation();
260d992db3827016388e8069f5793b031153d423501Mathias Agopian    mTransform = tr;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26499ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopianvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions) {
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
26899ce5cdeb383216dee95af4d90e47406b0948ea1Mathias Agopian        const Transform& planeTransform, Region& outDirtyRegion) {
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
27320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
27420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
27520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
28320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
28420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
292a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl)
293a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{
294a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
295a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->hints = 0;
296a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->flags = HWC_SKIP_LAYER;
297a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->transform = 0;
298a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->blending = HWC_BLENDING_NONE;
299a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
300a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // this gives us only the "orientation" component of the transform
301a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const State& s(drawingState());
302a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const uint32_t finalTransform = s.transform.getOrientation();
303a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // we can only handle simple transformation
304a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (finalTransform & Transform::ROT_INVALID) {
305a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->flags = HWC_SKIP_LAYER;
306a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    } else {
307a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->transform = finalTransform;
308a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
309a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
310a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (!isOpaque()) {
311a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->blending = mPremultipliedAlpha ?
312a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE;
313a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
314a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
315a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // scaling is already applied in mTransformedBounds
316a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.left   = mTransformedBounds.left;
317a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.top    = mTransformedBounds.top;
318a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.right  = mTransformedBounds.right;
319a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.bottom = mTransformedBounds.bottom;
320a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->visibleRegionScreen.rects =
321a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian            reinterpret_cast<hwc_rect_t const *>(
322a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                    visibleRegionScreen.getArray(
323a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                            &hwcl->visibleRegionScreen.numRects));
324a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
325a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.left   = 0;
326a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.top    = 0;
327a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.right  = mTransformedBounds.width();
328a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.bottom = mTransformedBounds.height();
329a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
330a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
331c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) {
332c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
333c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->handle = NULL;
334c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
335c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
336f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopianvoid LayerBase::setOverlay(bool inOverlay) {
337f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian    mInOverlay = inOverlay;
338f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian}
339f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian
340f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopianbool LayerBase::isOverlay() const {
341f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian    return mInOverlay;
342f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian}
343f384cc3008a25ad1b00403aca0cc001547f029c6Mathias Agopian
344a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering)
345a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
346a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFiltering = filtering;
347a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
348a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
349a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const
350a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
351a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return mFiltering;
352a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
353a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
354bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
362a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawForSreenShot()
36374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{
36474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
365a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(true);
36674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    onDraw( Region(hw.bounds()) );
367a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(false);
36874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
36974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
370010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
371010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
372010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
376010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
3770a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
378c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_TEXTURE_EXTERNAL_OES);
379a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    glDisable(GL_TEXTURE_2D);
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
38120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
38220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
38320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
38495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
38578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
38695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
38795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
38895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
38995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
39095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
39529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
39629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
39729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
39829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
399a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip) const
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
40699ed22412db547c59d3da08114d9d5a586442b30Glenn Kasten    if (CC_UNLIKELY(s.alpha < 0xFF)) {
40749753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
40849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
40949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
41149753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
41549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
41778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
41849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
419a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (!isOpaque()) {
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
427b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    struct TexCoords {
428b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat u;
429b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat v;
43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
43178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
432b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    TexCoords texCoords[4];
433a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[0].u = 0;
434a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[0].v = 1;
435a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[1].u = 0;
436a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[1].v = 0;
437a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[2].u = 1;
438a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[2].v = 0;
439a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[3].u = 1;
440a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[3].v = 1;
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
446b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    Region::const_iterator it = clip.begin();
447b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    Region::const_iterator const end = clip.end();
44878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
44978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
45078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
45178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
45278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
45478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
455c492e67810814bf86301abffe1d31598b775cf45Mathias Agopian    glDisable(GL_BLEND);
456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
457edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
461c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
462c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    snprintf(buffer, SIZE,
463c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            "+ %s %p (%s)\n",
464c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian            getTypeId(), this, getName().string());
465c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian    result.append(buffer);
466c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
46782d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    s.transparentRegion.dump(result, "transparentRegion");
46882d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    transparentRegionScreen.dump(result, "transparentRegionScreen");
46982d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian    visibleRegionScreen.dump(result, "visibleRegionScreen");
470c95dbdc236acf002b5f8aed8c8a9e43047fc75b5Mathias Agopian
4711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
47341b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian            "z=%9d, pos=(%g,%g), size=(%4d,%4d), "
474a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, "
4751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
47622da60c3e64cd57535cbba063c07127814a2b52fMathias Agopian            s.z, s.transform.tx(), s.transform.ty(), s.w, s.h,
477a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            isOpaque(), needsDithering(), contentDirty,
4781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
48354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
48425e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const {
48548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBase::dump(result, scratch, size);
48648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
48748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
48825e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::dumpStats(String8& result, char* scratch, size_t SIZE) const {
48925e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian}
49025e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopian
49125e66fc324bbc004fa8902b2d4699e41bb601104Mathias Agopianvoid LayerBase::clearStats() {
49282d7ab6c7e0cf971e515134ccf072682dd1a2cdbMathias Agopian}
49348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
496631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4972e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
49996f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
500a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    : LayerBase(flinger, display),
501a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mHasSurface(false),
502a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mClientRef(client),
503948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
505076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
508edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
509b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
51096f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
511b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
512edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
515a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface()
516a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
517a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    class BSurface : public BnSurface, public LayerCleaner {
518a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; }
519a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    public:
520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        BSurface(const sp<SurfaceFlinger>& flinger,
521a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                const sp<LayerBaseClient>& layer)
522a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            : LayerCleaner(flinger, layer) { }
523a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    };
524a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> sur(new BSurface(mFlinger, this));
525a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return sur;
526a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
527a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
528a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface()
529076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
530a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> s;
531076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
532a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
533a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
534a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian            "LayerBaseClient::getSurface() has already been called");
535a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
536a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mHasSurface = true;
537a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    s = createSurface();
538a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mClientSurfaceBinder = s->asBinder();
539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5420d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const {
5430d1561275e80073807ac04728951782d943f8882Mathias Agopian    return mClientSurfaceBinder;
5440d1561275e80073807ac04728951782d943f8882Mathias Agopian}
5450d1561275e80073807ac04728951782d943f8882Mathias Agopian
546582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
547582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    return 0;
548582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
549582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
5501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
554b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
55696f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
55796f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
56248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
56348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const
56448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{
56548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBaseClient::dump(result, scratch, size);
56648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
56748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
570a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
571a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const sp<LayerBaseClient>& layer)
572a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    : mFlinger(flinger), mLayer(layer) {
573076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
575a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() {
5769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
577a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFlinger->destroySurface(mLayer);
578b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
579b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
580edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
581edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
582edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
583