LayerBase.cpp revision c7f3381c3b2945e441747130eae88214435d0819
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),
46a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian      mNeedsFiltering(false),
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
48ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian      mLeft(0), mTop(0),
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
50245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false),
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mInvalidate(0)
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
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
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t 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}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
214a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
215733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        // we may use linear filtering, if the matrix scales us
216733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        const uint8_t type = temp.transform.getType();
217733189d408e13b54fd70971b265244367efd0f51Mathias Agopian        mNeedsFiltering = (!temp.transform.preserveRects() ||
218733189d408e13b54fd70971b265244367efd0f51Mathias Agopian                (type >= Transform::SCALE));
219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
222ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
231ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
232ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    const uint32_t hw_h = hw.getHeight();
233ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
234cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
235cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
240ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian    for (size_t i=0 ; i<4 ; i++)
241ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian        mVertices[i][1] = hw_h - mVertices[i][1];
242ffcf4657718831edecb6ff2ed1b45ac8bf8b9a58Mathias Agopian
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
260d992db3827016388e8069f5793b031153d423501Mathias Agopian    mTransform = tr;
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLeft = tr.tx();
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTop  = tr.ty();
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions)
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform& planeTransform, Region& outDirtyRegion)
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_and(~1, &mInvalidate)&1) == 1) {
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outDirtyRegion.orSelf(visibleRegionScreen);
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
28720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
28920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
29720f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
29820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
306a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopianvoid LayerBase::setGeometry(hwc_layer_t* hwcl)
307a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian{
308a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
309a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->hints = 0;
310a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->flags = HWC_SKIP_LAYER;
311a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->transform = 0;
312a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->blending = HWC_BLENDING_NONE;
313a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
314a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // this gives us only the "orientation" component of the transform
315a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const State& s(drawingState());
316a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    const uint32_t finalTransform = s.transform.getOrientation();
317a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // we can only handle simple transformation
318a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (finalTransform & Transform::ROT_INVALID) {
319a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->flags = HWC_SKIP_LAYER;
320a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    } else {
321a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->transform = finalTransform;
322a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
323a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
324a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    if (!isOpaque()) {
325a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian        hwcl->blending = mPremultipliedAlpha ?
326a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE;
327a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    }
328a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian
329a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    // scaling is already applied in mTransformedBounds
330a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.left   = mTransformedBounds.left;
331a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.top    = mTransformedBounds.top;
332a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.right  = mTransformedBounds.right;
333a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->displayFrame.bottom = mTransformedBounds.bottom;
334a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->visibleRegionScreen.rects =
335a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian            reinterpret_cast<hwc_rect_t const *>(
336a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                    visibleRegionScreen.getArray(
337a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian                            &hwcl->visibleRegionScreen.numRects));
338a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
339a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.left   = 0;
340a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.top    = 0;
341a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.right  = mTransformedBounds.width();
342a537c0f42e8077baafcbc65844adf1ec8397c040Mathias Agopian    hwcl->sourceCrop.bottom = mTransformedBounds.height();
343a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian}
344a350ff98692b3a50cad5cc93f9f83221242ca86aMathias Agopian
345c7f3381c3b2945e441747130eae88214435d0819Mathias Agopianvoid LayerBase::setPerFrameData(hwc_layer_t* hwcl) {
346c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->compositionType = HWC_FRAMEBUFFER;
347c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian    hwcl->handle = NULL;
348c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian}
349c7f3381c3b2945e441747130eae88214435d0819Mathias Agopian
350a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::setFiltering(bool filtering)
351a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
352a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFiltering = filtering;
353a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
354a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
355a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianbool LayerBase::getFiltering() const
356a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
357a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return mFiltering;
358a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
359a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
360bc7e31a84b936a5a9ac295db56f0836c50c1ac7fMathias Agopianvoid LayerBase::draw(const Region& clip) const
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
368a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawForSreenShot()
36974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian{
37074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    const DisplayHardware& hw(graphicPlane(0).displayHardware());
371a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(true);
37274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian    onDraw( Region(hw.bounds()) );
373a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    setFiltering(false);
37474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian}
37574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian
376010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
377010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
378010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
382010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
3830a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
384a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#if defined(GL_OES_EGL_image_external)
385a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (GLExtensions::getInstance().haveTextureExternal()) {
386a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            glDisable(GL_TEXTURE_EXTERNAL_OES);
387a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        }
388a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#endif
389a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    glDisable(GL_TEXTURE_2D);
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
39220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
39320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
39420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
39595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
39678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
39795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
39895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
39995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
40095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
40195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
40629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
40729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
40829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
40929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
410a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip) const
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
41849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
41949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
42049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
42249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
42649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
42949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
430a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        if (!isOpaque()) {
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
438b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    struct TexCoords {
439b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat u;
440b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian        GLfloat v;
44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
443b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    TexCoords texCoords[4];
444a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[0].u = 0;
445a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[0].v = 1;
446a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[1].u = 0;
447a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[1].v = 0;
448a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[2].u = 1;
449a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[2].v = 0;
450a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[3].u = 1;
451a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    texCoords[3].v = 1;
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4530a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    if (needsDithering()) {
4540a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian        glEnable(GL_DITHER);
4550a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    } else {
4560a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian        glDisable(GL_DITHER);
4570a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    }
4580a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
45978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
46078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
46178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
463b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    Region::const_iterator it = clip.begin();
464b661d66013b9803c50dc78ca0247ac39caef443aMathias Agopian    Region::const_iterator const end = clip.end();
46578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
46678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
46778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
46878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
46978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
47178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
472edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
4771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "+ %s %p\n"
4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
4801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
481a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            "isOpaque=%1d, needsDithering=%1d, invalidate=%1d, "
4821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
4831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getTypeId(), this, s.z, tx(), ty(), s.w, s.h,
484a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            isOpaque(), needsDithering(), contentDirty,
4851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4881b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4891b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
49054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
49148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBase::shortDump(String8& result, char* scratch, size_t size) const
49248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{
49348b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBase::dump(result, scratch, size);
49448b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
49548b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
49648b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
499631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
5002e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
50296f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
503a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    : LayerBase(flinger, display),
504a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mHasSurface(false),
505a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian      mClientRef(client),
506948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
507edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
508076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
512b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
51396f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
514b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
515edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
516edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
518a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::createSurface()
519a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian{
520a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    class BSurface : public BnSurface, public LayerCleaner {
521a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        virtual sp<ISurfaceTexture> getSurfaceTexture() const { return 0; }
522a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    public:
523a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        BSurface(const sp<SurfaceFlinger>& flinger,
524a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian                const sp<LayerBaseClient>& layer)
525a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian            : LayerCleaner(flinger, layer) { }
526a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    };
527a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> sur(new BSurface(mFlinger, this));
528a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    return sur;
529a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian}
530a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian
531a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopiansp<ISurface> LayerBaseClient::getSurface()
532076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
533a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    sp<ISurface> s;
534076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
535a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
536a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    LOG_ALWAYS_FATAL_IF(mHasSurface,
537a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian            "LayerBaseClient::getSurface() has already been called");
538a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian
539a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mHasSurface = true;
540a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    s = createSurface();
541a1f47b90ab53af978be45b8bda16c5d084ae66e6Mathias Agopian    mClientSurfaceBinder = s->asBinder();
542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
543076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
544076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5450d1561275e80073807ac04728951782d943f8882Mathias Agopianwp<IBinder> LayerBaseClient::getSurfaceBinder() const {
5460d1561275e80073807ac04728951782d943f8882Mathias Agopian    return mClientSurfaceBinder;
5470d1561275e80073807ac04728951782d943f8882Mathias Agopian}
5480d1561275e80073807ac04728951782d943f8882Mathias Agopian
549582270d69db94286a248bd829f1ae6f910d45124Jamie Genniswp<IBinder> LayerBaseClient::getSurfaceTextureBinder() const {
550582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis    return 0;
551582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis}
552582270d69db94286a248bd829f1ae6f910d45124Jamie Gennis
5531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
557b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
5591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      name=%s\n"
56096f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
5611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getName().string(),
56296f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5631b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5641b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5651b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5661b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
56748b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
56848b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopianvoid LayerBaseClient::shortDump(String8& result, char* scratch, size_t size) const
56948b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian{
57048b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian    LayerBaseClient::dump(result, scratch, size);
57148b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian}
57248b888aab9fdcfba250722dffbdffe61f11c64f3Mathias Agopian
573076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
575a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::LayerCleaner(const sp<SurfaceFlinger>& flinger,
576a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian        const sp<LayerBaseClient>& layer)
577a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    : mFlinger(flinger), mLayer(layer) {
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
580a67932fe6864ac346e7f78b86df11cf6c5344137Mathias AgopianLayerBaseClient::LayerCleaner::~LayerCleaner() {
5819a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
582a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian    mFlinger->destroySurface(mLayer);
583b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
584b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
585edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
586edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
587edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
588