LayerBase.cpp revision b7e930db175c192464cebdeb49eb56cf6dd60114
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
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : dpy(display), contentDirty(false),
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mFlinger(flinger),
45a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian      mNeedsFiltering(false),
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
47ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian      mLeft(0), mTop(0),
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
49245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false),
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mInvalidate(0)
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
60d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
877e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) {
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1387e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1407e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
1977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2036656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2046656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2087e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
213a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
214a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian        mNeedsFiltering = false;
215a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            // we may use linear filtering, if the matrix scales us
217a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            const uint8_t type = temp.transform.getType();
218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
219a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian                mNeedsFiltering = true;
220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            }
221a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        }
222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
225ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
235cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
236cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLeft = tr.tx();
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTop  = tr.ty();
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions)
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform& planeTransform, Region& outDirtyRegion)
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_and(~1, &mInvalidate)&1) == 1) {
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outDirtyRegion.orSelf(visibleRegionScreen);
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip()
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
28820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
28920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
29820f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
29920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // invalidate the region we'll update
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region clip(inClip);  // copy-on-write, so no-op most of the time
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Remove the transparent area from the clipping region
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s = drawingState();
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(!s.transparentRegion.isEmpty())) {
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        clip.subtract(transparentRegionScreen);
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (clip.isEmpty()) {
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // usually this won't happen because this should be taken care of
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // by SurfaceFlinger::computeVisibleRegions()
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_BLEND);
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glColor4x(0, 0x8000, 0, 0x10000);
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawRegion(transparentRegionScreen);
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    */
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
339010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
340010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
341010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
345010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
34920f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
35020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
35120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
35295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
35378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
35495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
35595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
35695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
35795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
35895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
359edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36229aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
36329aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
36429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3671fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
3720926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind our texture
3741fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    validateTexture(texture.name);
3751fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t width  = texture.width;
3761fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t height = texture.height;
3771fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_TEXTURE_2D);
379edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
38249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
38349753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
38449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
38649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
39049753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
39278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
39349753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator it = clip.begin();
40395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator const end = clip.end();
40478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    const GLfloat texCoords[4][2] = {
40578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  0 },
40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  1 },
40778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  1 },
40878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  0 }
40978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
41078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
41178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glMatrixMode(GL_TEXTURE);
41278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glLoadIdentity();
41378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
41478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    // the texture's source is rotated
41578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    switch (texture.transform) {
41678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_90:
41778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(0, 1, 0);
41878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-90, 0, 0, 1);
41978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_180:
42178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 1, 0);
42278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-180, 0, 0, 1);
42378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_270:
42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 0, 0);
42678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-270, 0, 0, 1);
42778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
4295994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang
43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    if (texture.NPOTAdjust) {
43178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScalef(texture.wScale, texture.hScale, 1.0f);
43278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
43578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
43978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
446edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, textureName);
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: reload the texture if needed
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this is currently done in loadTexture() below
452a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian    if (needsFiltering()) {
453a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
454a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
455a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    } else {
456a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
457a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
458a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
459401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian
460401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    if (needsDithering()) {
461401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glEnable(GL_DITHER);
462401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    } else {
463401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glDisable(GL_DITHER);
464401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    }
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4671b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4681b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
4701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "+ %s %p\n"
4721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
4731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
4741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, "
4751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
4761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getTypeId(), this, s.z, tx(), ty(), s.w, s.h,
4771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            needsBlending(), needsDithering(), contentDirty,
4781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
48354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
485edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
486631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4872e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
48996f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
490b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    : LayerBase(flinger, display), mClientRef(client),
491948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
493076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
495edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
497b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> c(mClientRef.promote());
49896f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
499b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian        c->detachLayer(this);
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
503076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
504076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
505076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<Surface> s;
506076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
507076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    s = mClientSurface.promote();
508076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (s == 0) {
509076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        s = createSurface();
510076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mClientSurface = s;
511076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
512076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
513076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
514076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
515076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
51796f0819f81293076e652792794a961543e6750d7Mathias Agopian    return new Surface(mFlinger, mIdentity,
518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            const_cast<LayerBaseClient *>(this));
519076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5211b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5221b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
525b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian    sp<Client> client(mClientRef.promote());
5261b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
5271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      name=%s\n"
52896f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
5291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getName().string(),
53096f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5311b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5321b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5331b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
535076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
536076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5379a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface(
5389a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        const sp<SurfaceFlinger>& flinger,
53996f0819f81293076e652792794a961543e6750d7Mathias Agopian        int identity,
540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const sp<LayerBaseClient>& owner)
54196f0819f81293076e652792794a961543e6750d7Mathias Agopian    : mFlinger(flinger), mIdentity(identity), mOwner(owner)
5429a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
543076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
544076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5459a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface()
5469a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
5479a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    /*
5489a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * This is a good place to clean-up all client resources
5499a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     */
5509a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian
5519a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
5529a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    sp<LayerBaseClient> layer = getOwner();
5539a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    if (layer != 0) {
5549a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        mFlinger->destroySurface(layer);
5559a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    }
556076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
557076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<LayerBaseClient> owner(mOwner.promote());
560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return owner;
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact(
564375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
566076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (code) {
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case REGISTER_BUFFERS:
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case UNREGISTER_BUFFERS:
569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case CREATE_OVERLAY:
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        {
571375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian            if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) {
572375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                IPCThreadState* ipc = IPCThreadState::self();
573375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int pid = ipc->getCallingPid();
574375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int uid = ipc->getCallingUid();
575375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                LOGE("Permission Denial: "
576375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
577375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                return PERMISSION_DENIED;
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return BnSurface::onTransact(code, data, reply, flags);
582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
584a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx,
585a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t w, uint32_t h, uint32_t format, uint32_t usage)
586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
590b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount)
591b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{
592b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    return INVALID_OPERATION;
593b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
594b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers(
596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const ISurface::BufferHeap& buffers)
597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
598076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return INVALID_OPERATION;
599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset)
602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers()
606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay(
61052e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
614edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
615edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
618