LayerBase.cpp revision 631f358d348ea5e7813ca01f86fc9f2a6536add6
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),
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransformed(false),
46a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian      mUseLinearFiltering(false),
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
48ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian      mLeft(0), mTop(0),
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
50245e4d78c5fb304fe153c36303ec69bf8a907f65Mathias Agopian      mPremultipliedAlpha(true), mName("unnamed"), mDebug(false),
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mInvalidate(0)
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
62d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
63d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
64d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
65d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
66d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
67d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
887e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
897e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
907e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
917e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
927e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
937e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
947e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1397e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1417e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1427e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: check the matrix has changed
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: check the region has changed
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
2007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
2017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2037e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2047e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2057e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2066656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2076656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2086656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2096656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2106656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
216a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
217a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        const bool linearFiltering = mUseLinearFiltering;
218a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        mUseLinearFiltering = false;
219a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
220a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            // we may use linear filtering, if the matrix scales us
221a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            const uint8_t type = temp.transform.getType();
222a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
223a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian                mUseLinearFiltering = true;
224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            }
225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        }
226a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
227a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
229ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
239cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
240cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformed = transformed;
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLeft = tr.tx();
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTop  = tr.ty();
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions)
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform& planeTransform, Region& outDirtyRegion)
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_and(~1, &mInvalidate)&1) == 1) {
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outDirtyRegion.orSelf(visibleRegionScreen);
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip()
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
29320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
29420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
29520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
30420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // invalidate the region we'll update
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region clip(inClip);  // copy-on-write, so no-op most of the time
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Remove the transparent area from the clipping region
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s = drawingState();
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(!s.transparentRegion.isEmpty())) {
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        clip.subtract(transparentRegionScreen);
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (clip.isEmpty()) {
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // usually this won't happen because this should be taken care of
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // by SurfaceFlinger::computeVisibleRegions()
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_BLEND);
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glColor4x(0, 0x8000, 0, 0x10000);
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawRegion(transparentRegionScreen);
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    */
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
34429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampx red,
34529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin                                GLclampx green, GLclampx blue,
34629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin                                GLclampx alpha) const
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
35029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    glColor4x(red,green,blue,alpha);
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
35420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
35520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
35620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
35795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
35878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
35995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
36095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
36195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
36295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
36395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
365edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
366edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
36829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
36929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
37029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
37129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3721fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
375edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
376edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
3770926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind our texture
3791fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    validateTexture(texture.name);
3801fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t width  = texture.width;
3811fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t height = texture.height;
3821fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian
383edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_TEXTURE_2D);
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // We have an alpha-modulation. We need to modulate all
387edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // texture components by alpha because we're always using
388edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // premultiplied alpha.
389edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
390edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // If the texture doesn't have an alpha channel we can
391edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // use REPLACE and switch to non premultiplied alpha
392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // blending (SRCA/ONE_MINUS_SRCA).
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum env, src;
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            env = GL_MODULATE;
397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
399edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            env = GL_REPLACE;
400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            src = GL_SRC_ALPHA;
401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
40278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLfloat alpha = s.alpha * (1.0f/255.0f);
40378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(alpha, alpha, alpha, alpha);
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env);
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
40978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glColor4f(1, 1, 1, 1);
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator it = clip.begin();
42095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator const end = clip.end();
42178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    const GLfloat texCoords[4][2] = {
42278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  0 },
42378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 0,  1 },
42478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  1 },
42578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            { 1,  0 }
42678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    };
42778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
42878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glMatrixMode(GL_TEXTURE);
42978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glLoadIdentity();
43078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian
43178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    // the texture's source is rotated
43278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    switch (texture.transform) {
43378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_90:
43478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(0, 1, 0);
43578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-90, 0, 0, 1);
43678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
43778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_180:
43878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 1, 0);
43978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-180, 0, 0, 1);
44078fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
44178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        case HAL_TRANSFORM_ROT_270:
44278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glTranslatef(1, 0, 0);
44378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            glRotatef(-270, 0, 0, 1);
44478fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian            break;
44578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
4465994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang
44778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    if (texture.NPOTAdjust) {
44878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScalef(texture.wScale, texture.hScale, 1.0f);
44978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    }
450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
45278fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glVertexPointer(2, GL_FLOAT, 0, mVertices);
45378fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
454edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45578fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    while (it != end) {
45678fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const Rect& r = *it++;
45778fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
45878fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glScissor(r.left, sy, r.width(), r.height());
45978fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
46178fd5010a87425d2be401d10a306dd68638fc1ddMathias Agopian    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
463edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
464edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const
465edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
466edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, textureName);
467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: reload the texture if needed
468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this is currently done in loadTexture() below
469a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    if (mUseLinearFiltering) {
470a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
471a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
472a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    } else {
473a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
474a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
475a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
476401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian
477401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    if (needsDithering()) {
478401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glEnable(GL_DITHER);
479401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    } else {
480401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glDisable(GL_DITHER);
481401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    }
482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
483edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4841b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBase::dump(String8& result, char* buffer, size_t SIZE) const
4851b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
4861b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    const Layer::State& s(drawingState());
4871b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
4881b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "+ %s %p\n"
4891b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      "
4901b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "z=%9d, pos=(%4d,%4d), size=(%4d,%4d), "
4911b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "needsBlending=%1d, needsDithering=%1d, invalidate=%1d, "
4921b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "alpha=0x%02x, flags=0x%08x, tr=[%.2f, %.2f][%.2f, %.2f]\n",
4931b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getTypeId(), this, s.z, tx(), ty(), s.w, s.h,
4941b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            needsBlending(), needsDithering(), contentDirty,
4951b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.alpha, s.flags,
4961b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[0][0], s.transform[0][1],
4971b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            s.transform[1][0], s.transform[1][1]);
4981b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
4991b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
50054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
503631f358d348ea5e7813ca01f86fc9f2a6536add6Mathias Agopianint32_t LayerBaseClient::sIdentity = 1;
5042e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
506f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian        const sp<Client>& client, int32_t i)
507d606de6bb6877dc4ab93ec0be0c6bda4a8ee1ce8Mathias Agopian    : LayerBase(flinger, display), client(client), mIndex(i),
508948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
510076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
511edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
512076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::onFirstRef()
513076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
514f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
515f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
516076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        client->bindLayer(this, mIndex);
517edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
518edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
521edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
522f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
523f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
524edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        client->free(mIndex);
525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
527edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5281b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianssize_t LayerBaseClient::serverIndex() const
529f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian{
530f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
531f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
532edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (client->cid<<16)|mIndex;
533edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5341b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    return ssize_t(0xFFFF0000 | mIndex);
535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
537076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
538076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
539076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<Surface> s;
540076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
541076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    s = mClientSurface.promote();
542076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (s == 0) {
543076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        s = createSurface();
544076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mClientSurface = s;
545076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
546076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
547076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
549076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
550076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
5519a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    return new Surface(mFlinger, clientIndex(), mIdentity,
552076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            const_cast<LayerBaseClient *>(this));
553076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
554076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5551b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopianvoid LayerBaseClient::dump(String8& result, char* buffer, size_t SIZE) const
5561b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian{
5571b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    LayerBase::dump(result, buffer, SIZE);
5581b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5591b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    sp<Client> client(this->client.promote());
5601b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    snprintf(buffer, SIZE,
5611b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      name=%s\n"
5621b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            "      id=0x%08x, client=0x%08x, identity=%u\n",
5631b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getName().string(),
5641b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            clientIndex(), client.get() ? client->cid : 0,
5651b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian            getIdentity());
5661b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
5671b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian    result.append(buffer);
5681b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian}
5691b5e1021b8c9b87113b70d94dfb7b50f8c5b01b8Mathias Agopian
570076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
571076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5729a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface(
5739a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        const sp<SurfaceFlinger>& flinger,
5749a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        SurfaceID id, int identity,
575076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const sp<LayerBaseClient>& owner)
5769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner)
5779a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
578076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
579076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5809a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface()
5819a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
5829a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    /*
5839a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * This is a good place to clean-up all client resources
5849a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     */
5859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian
5869a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
5879a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    sp<LayerBaseClient> layer = getOwner();
5889a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    if (layer != 0) {
5899a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        mFlinger->destroySurface(layer);
5909a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    }
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
592076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
593076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
594076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<LayerBaseClient> owner(mOwner.promote());
595076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return owner;
596076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
597076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
598076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact(
599375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
600076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (code) {
602076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case REGISTER_BUFFERS:
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case UNREGISTER_BUFFERS:
604076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case CREATE_OVERLAY:
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        {
606375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian            if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) {
607375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                IPCThreadState* ipc = IPCThreadState::self();
608375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int pid = ipc->getCallingPid();
609375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int uid = ipc->getCallingUid();
610375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                LOGE("Permission Denial: "
611375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
612375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                return PERMISSION_DENIED;
613076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
616076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return BnSurface::onTransact(code, data, reply, flags);
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
619a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int bufferIdx,
620a138f89c5e78b7e8994823e97d6e860869762837Mathias Agopian        uint32_t w, uint32_t h, uint32_t format, uint32_t usage)
621076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
624076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
625b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopianstatus_t LayerBaseClient::Surface::setBufferCount(int bufferCount)
626b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian{
627b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian    return INVALID_OPERATION;
628b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian}
629b5b7f260da2c1a2a82e0311e2015d49a82f43667Mathias Agopian
630076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers(
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const ISurface::BufferHeap& buffers)
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return INVALID_OPERATION;
634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
635076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
636076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset)
637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers()
641076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
642076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay(
64552e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
647076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
648076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
652edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
653