LayerBase.cpp revision 96f0819f81293076e652792794a961543e6750d7
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    // TODO: check the matrix has changed
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: check the region has changed
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2047e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2056656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2096656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2107e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
215a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
216a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian        mNeedsFiltering = false;
217a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            // we may use linear filtering, if the matrix scales us
219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            const uint8_t type = temp.transform.getType();
220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
221a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian                mNeedsFiltering = true;
222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            }
223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        }
224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
227ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
237cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
238cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLeft = tr.tx();
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTop  = tr.ty();
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions)
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform& planeTransform, Region& outDirtyRegion)
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_and(~1, &mInvalidate)&1) == 1) {
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outDirtyRegion.orSelf(visibleRegionScreen);
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip()
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
29020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
29120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
29220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
30020f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // invalidate the region we'll update
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region clip(inClip);  // copy-on-write, so no-op most of the time
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Remove the transparent area from the clipping region
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s = drawingState();
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(!s.transparentRegion.isEmpty())) {
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        clip.subtract(transparentRegionScreen);
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (clip.isEmpty()) {
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // usually this won't happen because this should be taken care of
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // by SurfaceFlinger::computeVisibleRegions()
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_BLEND);
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glColor4x(0, 0x8000, 0, 0x10000);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawRegion(transparentRegionScreen);
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    */
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
341010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopianvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampf red,
342010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf green, GLclampf blue,
343010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian                                GLclampf alpha) const
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
347010fccb0637f8a69a35ee1a7feb228d213f6d542Mathias Agopian    glColor4f(red,green,blue,alpha);
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
35120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
35220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
35320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
35495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
35578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
35695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
35795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
35895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
35995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
36095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
36729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3691fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
3740926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind our texture
3761fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    validateTexture(texture.name);
3771fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t width  = texture.width;
3781fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t height = texture.height;
3791fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian
380edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_TEXTURE_2D);
381edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian    GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
38449753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
38549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        if (mPremultipliedAlpha) {
38649753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(alpha, alpha, alpha, alpha);
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
38849753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian            glColor4f(1, 1, 1, alpha);
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
39249753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
39478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
39549753266d2219d2fbf5c33dc4626f299dffcdd76Mathias Agopian        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator it = clip.begin();
40595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator const end = clip.end();
40678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    const GLfloat texCoords[4][2] = {
40778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  0 },
40878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  1 },
40978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  1 },
41078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  0 }
41178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
41278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
41378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glMatrixMode(GL_TEXTURE);
41478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glLoadIdentity();
41578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
41678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    // the texture's source is rotated
41778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    switch (texture.transform) {
41878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_90:
41978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(0, 1, 0);
42078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-90, 0, 0, 1);
42178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_180:
42378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 1, 0);
42478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-180, 0, 0, 1);
42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
42678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_270:
42778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 0, 0);
42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-270, 0, 0, 1);
42978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
4315994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang
43278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    if (texture.NPOTAdjust) {
43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScalef(texture.wScale, texture.hScale, 1.0f);
43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
439edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
445edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
44678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
447edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
448edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
451edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, textureName);
452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: reload the texture if needed
453edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this is currently done in loadTexture() below
454a7f669256f93a593c723f05784ef04d3c7d052bbMathias Agopian    if (needsFiltering()) {
455a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
456a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
457a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    } else {
458a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
459a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
460a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
461401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian
462401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    if (needsDithering()) {
463401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glEnable(GL_DITHER);
464401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    } else {
465401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glDisable(GL_DITHER);
466401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    }
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4701b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4711b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
4721b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4731b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "+ %s %p\n"
4741b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
4751b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
4761b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, "
4771b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
4781b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getTypeId(), this, s.z, tx(), ty(), s.w, s.h,
4791b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            needsBlending(), needsDithering(), contentDirty,
4801b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4811b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4821b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4831b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
48554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
488631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
4892e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
490edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
49196f0819f81293076e652792794a961543e6750d7Mathias Agopian        const sp<Client>& client)
49296f0819f81293076e652792794a961543e6750d7Mathias Agopian    : LayerBase(flinger, display), client(client),
493948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
494edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
495076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49996f0819f81293076e652792794a961543e6750d7Mathias Agopian    sp<Client> c(client.promote());
50096f0819f81293076e652792794a961543e6750d7Mathias Agopian    if (c != 0) {
50196f0819f81293076e652792794a961543e6750d7Mathias Agopian        c->free(this);
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
505076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
506076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
507076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<Surface> s;
508076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
509076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    s = mClientSurface.promote();
510076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (s == 0) {
511076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        s = createSurface();
512076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mClientSurface = s;
513076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
514076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
515076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
517076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
518076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
51996f0819f81293076e652792794a961543e6750d7Mathias Agopian    return new Surface(mFlinger, mIdentity,
520076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            const_cast<LayerBaseClient *>(this));
521076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
522076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5231b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5241b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5251b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5261b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5271b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    sp<Client> client(this->client.promote());
5281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
5291b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      name=%s\n"
53096f0819f81293076e652792794a961543e6750d7Mathias Agopian            "      client=%p, identity=%u\n",
5311b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getName().string(),
53296f0819f81293076e652792794a961543e6750d7Mathias Agopian            client.get(), getIdentity());
5331b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5351b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5361b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5399a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface(
5409a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        const sp<SurfaceFlinger>& flinger,
54196f0819f81293076e652792794a961543e6750d7Mathias Agopian        int identity,
542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const sp<LayerBaseClient>& owner)
54396f0819f81293076e652792794a961543e6750d7Mathias Agopian    : mFlinger(flinger), mIdentity(identity), mOwner(owner)
5449a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
545076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5479a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface()
5489a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
5499a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    /*
5509a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * This is a good place to clean-up all client resources
5519a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     */
5529a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian
5539a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
5549a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    sp<LayerBaseClient> layer = getOwner();
5559a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    if (layer != 0) {
5569a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        mFlinger->destroySurface(layer);
5579a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    }
558076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
559076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
560076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<LayerBaseClient> owner(mOwner.promote());
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return owner;
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact(
566375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
567076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
568076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (code) {
569076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case REGISTER_BUFFERS:
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case UNREGISTER_BUFFERS:
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case CREATE_OVERLAY:
572076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        {
573375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian            if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) {
574375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                IPCThreadState* ipc = IPCThreadState::self();
575375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int pid = ipc->getCallingPid();
576375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int uid = ipc->getCallingUid();
577375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                LOGE("Permission Denial: "
578375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
579375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                return PERMISSION_DENIED;
580076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
581076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
582076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
583076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return BnSurface::onTransact(code, data, reply, flags);
584076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
585076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
586a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx,
587a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t w, uint32_t h, uint32_t format, uint32_t usage)
588076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
589076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
590076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
592b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount)
593b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{
594b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    return INVALID_OPERATION;
595b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
596b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers(
598076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const ISurface::BufferHeap& buffers)
599076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return INVALID_OPERATION;
601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset)
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
606076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers()
608076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
609076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
611076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay(
61252e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
616edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
617edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
618edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
619edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
620