LayerBase.cpp revision f6679fc6f70939643901f29a9a69e40c603e6e5f
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"
35d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian#include "TextureManager.h"
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
42f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopianint32_t LayerBase::sSequence = 1;
43f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : dpy(display), contentDirty(false),
46f6679fc6f70939643901f29a9a69e40c603e6e5fMathias Agopian      sequence(uint32_t(android_atomic_inc(&sSequence))),
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mFlinger(flinger),
48a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian      mNeedsFiltering(false),
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
50ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian      mLeft(0), mTop(0),
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
52245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false),
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mInvalidate(0)
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
69d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
70d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1437e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1447e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2047e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2096656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2106656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
217a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian        mNeedsFiltering = false;
218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            // we may use linear filtering, if the matrix scales us
220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            const uint8_t type = temp.transform.getType();
221a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
222a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian                mNeedsFiltering = true;
223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            }
224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        }
225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
226a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
228ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
238cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
239cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
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::finishPageFlip()
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
29320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // invalidate the region we'll update
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region clip(inClip);  // copy-on-write, so no-op most of the time
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Remove the transparent area from the clipping region
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s = drawingState();
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(!s.transparentRegion.isEmpty())) {
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        clip.subtract(transparentRegionScreen);
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (clip.isEmpty()) {
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // usually this won't happen because this should be taken care of
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // by SurfaceFlinger::computeVisibleRegions()
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
332010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
333010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
334010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
338010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
3390a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
3400a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    TextureManager::deactivateTextures();
3410a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
34420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
34520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
34620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
34795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
34878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
34995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
35095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
35195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
35295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
35395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
35829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
35929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
36029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
36129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3621fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
3670926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind our texture
3690a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    TextureManager::activateTexture(texture, needsFiltering());
3701fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t width  = texture.width;
3711fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t height = texture.height;
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37349753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
37549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
37649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
37749753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
37949753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
38349753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
38578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
38649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator it = clip.begin();
39695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator const end = clip.end();
39778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    const GLfloat texCoords[4][2] = {
39878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  0 },
39978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  1 },
40078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  1 },
40178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  0 }
40278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
40378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
40478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glMatrixMode(GL_TEXTURE);
40578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glLoadIdentity();
40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
40778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    // the texture's source is rotated
40878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    switch (texture.transform) {
40978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_90:
41078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(0, 1, 0);
41178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-90, 0, 0, 1);
41278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
41378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_180:
41478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 1, 0);
41578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-180, 0, 0, 1);
41678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
41778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_270:
41878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 0, 0);
41978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-270, 0, 0, 1);
42078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
4225994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang
42378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    if (texture.NPOTAdjust) {
42478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScalef(texture.wScale, texture.hScale, 1.0f);
42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4270a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    if (needsDithering()) {
4280a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian        glEnable(GL_DITHER);
4290a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    } else {
4300a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian        glDisable(GL_DITHER);
4310a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian    }
4320a91775c4df380d6a5b7f3ccad5127388ac01306Mathias Agopian
43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
43578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
43978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4461b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4471b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4481b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
4491b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4501b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "+ %s %p\n"
4511b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
4521b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
4531b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, "
4541b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
4551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getTypeId(), this, s.z, tx(), ty(), s.w, s.h,
4561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            needsBlending(), needsDithering(), contentDirty,
4571b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
46254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
465631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4662e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
46896f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
469b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    : LayerBase(flinger, display), mClientRef(client),
470948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
471edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
472076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
476b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
47796f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
478b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
480edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
482076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
483076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
484076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<Surface> s;
485076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
486076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    s = mClientSurface.promote();
487076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (s == 0) {
488076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        s = createSurface();
489076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mClientSurface = s;
490076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
491076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
492076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
493076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
494076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
49696f0819f81293076e652792794a961543e6750d7Mathias Agopian    return new Surface(mFlinger, mIdentity,
497076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            const_cast<LayerBaseClient *>(this));
498076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
499076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5001b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5011b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5021b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5031b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
504b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5051b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
5061b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      name=%s\n"
50796f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
5081b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getName().string(),
50996f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5101b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5111b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5121b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5131b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
514076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
515076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5169a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface(
5179a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        const sp<SurfaceFlinger>& flinger,
51896f0819f81293076e652792794a961543e6750d7Mathias Agopian        int identity,
519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const sp<LayerBaseClient>& owner)
52096f0819f81293076e652792794a961543e6750d7Mathias Agopian    : mFlinger(flinger), mIdentity(identity), mOwner(owner)
5219a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
523076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5249a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface()
5259a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
5269a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    /*
5279a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * This is a good place to clean-up all client resources
5289a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     */
5299a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian
5309a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
5319a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    sp<LayerBaseClient> layer = getOwner();
5329a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    if (layer != 0) {
5339a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        mFlinger->destroySurface(layer);
5349a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    }
535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<LayerBaseClient> owner(mOwner.promote());
539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return owner;
540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact(
543375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
544076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
545076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (code) {
546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case REGISTER_BUFFERS:
547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case UNREGISTER_BUFFERS:
548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case CREATE_OVERLAY:
549076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        {
550375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian            if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) {
551375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                IPCThreadState* ipc = IPCThreadState::self();
552375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int pid = ipc->getCallingPid();
553375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int uid = ipc->getCallingUid();
554375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                LOGE("Permission Denial: "
555375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
556375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                return PERMISSION_DENIED;
557076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return BnSurface::onTransact(code, data, reply, flags);
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
563a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx,
564a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t w, uint32_t h, uint32_t format, uint32_t usage)
565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
569b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount)
570b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{
571b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    return INVALID_OPERATION;
572b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
573b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
574076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers(
575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const ISurface::BufferHeap& buffers)
576076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
577076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return INVALID_OPERATION;
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset)
581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers()
585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay(
58952e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
593edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
594edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
595edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
596edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
597