LayerBase.cpp revision d12965934712ed0b9c1a264a6934dc0dad839ffd
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License.
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License.
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdlib.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h>
23310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IPCThreadState.h>
24310f8da0c3122ed5419db8f12a6e98d3188325b2Mathias Agopian#include <binder/IServiceManager.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/gl.h>
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <GLES/glext.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <hardware/hardware.h>
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "clz.h"
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "LayerBase.h"
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "SurfaceFlinger.h"
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include "DisplayHardware/DisplayHardware.h"
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst uint32_t LayerBase::typeInfo = 1;
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* const LayerBase::typeID = "LayerBase";
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst uint32_t LayerBaseClient::typeInfo = LayerBase::typeInfo | 2;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst char* const LayerBaseClient::typeID = "LayerBaseClient";
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::LayerBase(SurfaceFlinger* flinger, DisplayID display)
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : dpy(display), contentDirty(false),
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mFlinger(flinger),
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransformed(false),
53a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian      mUseLinearFiltering(false),
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mOrientation(0),
55ca6fab2b534fc7b252d0ee7ec2079afff7e5c308Mathias Agopian      mLeft(0), mTop(0),
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mTransactionFlags(0),
57d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian      mPremultipliedAlpha(true), mDebug(false),
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project      mInvalidate(0)
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(flinger->graphicPlane(0).displayHardware());
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mFlags = hw.getFlags();
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBase::~LayerBase()
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
68d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopianvoid LayerBase::setName(const String8& name) {
69d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    mName = name;
70d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
71d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
72d12965934712ed0b9c1a264a6934dc0dad839ffdMathias AgopianString8 LayerBase::getName() const {
73d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    return mName;
74d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian}
75d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectconst GraphicPlane& LayerBase::graphicPlane(int dpy) const
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGraphicPlane& LayerBase::graphicPlane(int dpy)
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mFlinger->graphicPlane(dpy);
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::initStates(uint32_t w, uint32_t h, uint32_t flags)
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t layerFlags = 0;
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eHidden)
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        layerFlags = ISurfaceComposer::eLayerHidden;
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (flags & ISurfaceComposer::eNonPremultiplied)
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mPremultipliedAlpha = false;
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
957e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.z             = 0;
967e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.w             = w;
977e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.h             = h;
987e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w   = w;
997e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h   = h;
1007e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.alpha         = 0xFF;
1017e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.flags         = layerFlags;
1027e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.sequence      = 0;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(0, 0);
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // drawing state & current state are identical
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
109ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopianvoid LayerBase::commitTransaction() {
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mDrawingState = mCurrentState;
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::forceVisibilityTransaction() {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this can be called without SurfaceFlinger.mStateLock, but if we
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // can atomically increment the sequence number, it doesn't matter.
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_inc(&mCurrentState.sequence);
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::requestTransaction() {
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    int32_t old = setTransactionFlags(eTransactionNeeded);
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return ((old & eTransactionNeeded) == 0);
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::getTransactionFlags(uint32_t flags) {
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_and(~flags, &mTransactionFlags) & flags;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::setTransactionFlags(uint32_t flags) {
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return android_atomic_or(flags, &mTransactionFlags);
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setPosition(int32_t x, int32_t y) {
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.transform.tx() == x && mCurrentState.transform.ty() == y)
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(x, y);
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setLayer(uint32_t z) {
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.z == z)
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.z = z;
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setSize(uint32_t w, uint32_t h) {
1467e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if (mCurrentState.requested_w == w && mCurrentState.requested_h == h)
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
1487e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_w = w;
1497e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    mCurrentState.requested_h = h;
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setAlpha(uint8_t alpha) {
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.alpha == alpha)
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.alpha = alpha;
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setMatrix(const layer_state_t::matrix22_t& matrix) {
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: check the matrix has changed
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transform.set(
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            matrix.dsdx, matrix.dsdy, matrix.dtdx, matrix.dtdy);
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setTransparentRegionHint(const Region& transparent) {
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: check the region has changed
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.transparentRegion = transparent;
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool LayerBase::setFlags(uint8_t flags, uint8_t mask) {
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t newFlags = (mCurrentState.flags & ~mask) | (flags & mask);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mCurrentState.flags == newFlags)
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return false;
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.sequence++;
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mCurrentState.flags = newFlags;
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    requestTransaction();
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectRect LayerBase::visibleBounds() const
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mTransformedBounds;
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setVisibleRegion(const Region& visibleRegion) {
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    visibleRegionScreen = visibleRegion;
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::setCoveredRegion(const Region& coveredRegion) {
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // always called from main thread
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    coveredRegionScreen = coveredRegion;
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectuint32_t LayerBase::doTransaction(uint32_t flags)
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& front(drawingState());
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& temp(currentState());
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2067e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    if ((front.requested_w != temp.requested_w) ||
2077e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        (front.requested_h != temp.requested_h))  {
2087e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        // resize the layer, set the physical size to the requested size
2097e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        Layer::State& editTemp(currentState());
2107e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.w = temp.requested_w;
2117e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian        editTemp.h = temp.requested_h;
2127e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian    }
2136656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian
2146656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    if ((front.w != temp.w) || (front.h != temp.h)) {
2156656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        // invalidate and recompute the visible regions if needed
2166656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        flags |= Layer::eVisibleRegion;
2176656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian        this->contentDirty = true;
2186656dbc81273424d9b4bf78c42a4e179dbe1cb71Mathias Agopian    }
2197e4a587f6038bcf9b58ca615fce9e52fd47e30c3Mathias Agopian
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (temp.sequence != front.sequence) {
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // invalidate and recompute the visible regions if needed
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        flags |= eVisibleRegion;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        this->contentDirty = true;
224a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
225a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        const bool linearFiltering = mUseLinearFiltering;
226a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        mUseLinearFiltering = false;
227a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        if (!(mFlags & DisplayHardware::SLOW_CONFIG)) {
228a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            // we may use linear filtering, if the matrix scales us
229a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            const uint8_t type = temp.transform.getType();
230a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            if (!temp.transform.preserveRects() || (type >= Transform::SCALE)) {
231a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian                mUseLinearFiltering = true;
232a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian            }
233a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        }
234a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
235a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Commit the transaction
237ba6be54876a19444f0b214b4b3b0749df227b013Mathias Agopian    commitTransaction();
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return flags;
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateVisibility(const Transform& planeTransform)
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Layer::State& s(drawingState());
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const Transform tr(planeTransform * s.transform);
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const bool transformed = tr.transformed();
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
247cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t w = s.w;
248cbb288bfe89f585bf48371bd31b2d4aafa32f32eMathias Agopian    uint32_t h = s.h;
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[0], 0, 0);
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[1], 0, h);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[2], w, h);
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    tr.transform(mVertices[3], w, 0);
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed)) {
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // NOTE: here we could also punt if we have too many rectangles
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // in the transparent region
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (tr.preserveRects()) {
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transform the transparent region
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen = tr.transform(s.transparentRegion);
259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // transformation too complex, can't do the transparent region
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // optimization.
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            transparentRegionScreen.clear();
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        transparentRegionScreen = s.transparentRegion;
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // cache a few things...
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mOrientation = tr.getOrientation();
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformedBounds = tr.makeBounds(w, h);
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTransformed = transformed;
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mLeft = tr.tx();
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    mTop  = tr.ty();
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::lockPageFlip(bool& recomputeVisibleRegions)
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::unlockPageFlip(
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const Transform& planeTransform, Region& outDirtyRegion)
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_and(~1, &mInvalidate)&1) == 1) {
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        outDirtyRegion.orSelf(visibleRegionScreen);
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::finishPageFlip()
289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::invalidate()
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if ((android_atomic_or(1, &mInvalidate)&1) == 0) {
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mFlinger->signalEvent();
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::drawRegion(const Region& reg) const
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
30120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = reg.begin();
30220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = reg.end();
30320f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    if (it != end) {
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        Rect r;
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const DisplayHardware& hw(graphicPlane(0).displayHardware());
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbWidth  = hw.getWidth();
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const int32_t fbHeight = hw.getHeight();
308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GLshort vertices[][2] = { { 0, 0 }, { fbWidth, 0 },
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                { fbWidth, fbHeight }, { 0, fbHeight }  };
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glVertexPointer(2, GL_SHORT, 0, vertices);
31120f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian        while (it != end) {
31220f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian            const Rect& r = *it++;
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            const GLint sy = fbHeight - (r.top + r.height());
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glScissor(r.left, sy, r.width(), r.height());
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::draw(const Region& inClip) const
321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // invalidate the region we'll update
323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Region clip(inClip);  // copy-on-write, so no-op most of the time
324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // Remove the transparent area from the clipping region
326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s = drawingState();
327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (LIKELY(!s.transparentRegion.isEmpty())) {
328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        clip.subtract(transparentRegionScreen);
329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (clip.isEmpty()) {
330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // usually this won't happen because this should be taken care of
331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            // by SurfaceFlinger::computeVisibleRegions()
332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return;
333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // reset GL state
337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_SCISSOR_TEST);
338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    onDraw(clip);
340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_BLEND);
345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glColor4x(0, 0x8000, 0, 0x10000);
347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    drawRegion(transparentRegionScreen);
348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    */
350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectGLuint LayerBase::createTexture() const
353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    GLuint textureName = -1;
355edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glGenTextures(1, &textureName);
356edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, textureName);
357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
359a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
360a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
361edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return textureName;
362edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
36429aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip, GLclampx red,
36529aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin                                GLclampx green, GLclampx blue,
36629aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin                                GLclampx alpha) const
367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
369edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
37029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    glColor4x(red,green,blue,alpha);
371edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_TEXTURE_2D);
372edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_BLEND);
373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glDisable(GL_DITHER);
37420f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian
37520f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator it = clip.begin();
37620f68782a4ea71c6a977d7f87d8288d3daa265ecMathias Agopian    Region::const_iterator const end = clip.end();
37795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glEnable(GL_SCISSOR_TEST);
37895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    glVertexPointer(2, GL_FIXED, 0, mVertices);
37995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    while (it != end) {
38095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const Rect& r = *it++;
38195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLint sy = fbHeight - (r.top + r.height());
38295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glScissor(r.left, sy, r.width(), r.height());
38395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
384edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38729aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavinvoid LayerBase::clearWithOpenGL(const Region& clip) const
38829aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin{
38929aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin    clearWithOpenGL(clip,0,0,0,0);
39029aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin}
39129aa74c546751ed04d17dc248a967eebaef63b21Rebecca Schultz Zavin
3921fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopianvoid LayerBase::drawWithOpenGL(const Region& clip, const Texture& texture) const
393edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
394edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const DisplayHardware& hw(graphicPlane(0).displayHardware());
395edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const uint32_t fbHeight = hw.getHeight();
396edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const State& s(drawingState());
3970926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopian
398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // bind our texture
3991fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    validateTexture(texture.name);
4001fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t width  = texture.width;
4011fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian    uint32_t height = texture.height;
4021fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian
403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glEnable(GL_TEXTURE_2D);
404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
405edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(s.alpha < 0xFF)) {
406edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // We have an alpha-modulation. We need to modulate all
407edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // texture components by alpha because we're always using
408edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // premultiplied alpha.
409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // If the texture doesn't have an alpha channel we can
411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // use REPLACE and switch to non premultiplied alpha
412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // blending (SRCA/ONE_MINUS_SRCA).
413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        GLenum env, src;
415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            env = GL_MODULATE;
417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
418edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            env = GL_REPLACE;
420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            src = GL_SRC_ALPHA;
421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
422edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        const GGLfixed alpha = (s.alpha << 16)/255;
423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glColor4x(alpha, alpha, alpha, alpha);
424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glEnable(GL_BLEND);
425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
426edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env);
427edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        glColor4x(0x10000, 0x10000, 0x10000, 0x10000);
430edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (needsBlending()) {
431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            GLenum src = mPremultipliedAlpha ? GL_ONE : GL_SRC_ALPHA;
432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glEnable(GL_BLEND);
433edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glBlendFunc(src, GL_ONE_MINUS_SRC_ALPHA);
434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        } else {
435edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            glDisable(GL_BLEND);
436edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
437edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
438edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
43995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator it = clip.begin();
44095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian    Region::const_iterator const end = clip.end();
441edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (UNLIKELY(transformed()
442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            || !(mFlags & DisplayHardware::DRAW_TEXTURE_EXTENSION) ))
443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    {
444edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        //StopWatch watch("GL transformed");
44595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        const GLfixed texCoords[4][2] = {
44695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian                { 0,        0 },
44795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian                { 0,        0x10000 },
44895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian                { 0x10000,  0x10000 },
44995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian                { 0x10000,  0 }
45095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        };
45195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian
45295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glMatrixMode(GL_TEXTURE);
45395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glLoadIdentity();
45495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian
45595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        // the texture's source is rotated
4565994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang        switch (texture.transform) {
4575994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang            case HAL_TRANSFORM_ROT_90:
4585994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glTranslatef(0, 1, 0);
4595994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glRotatef(-90, 0, 0, 1);
4605994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                break;
4615994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang            case HAL_TRANSFORM_ROT_180:
4625994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glTranslatef(1, 1, 0);
4635994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glRotatef(-180, 0, 0, 1);
4645994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                break;
4655994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang            case HAL_TRANSFORM_ROT_270:
4665994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glTranslatef(1, 0, 0);
4675994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                glRotatef(-270, 0, 0, 1);
4685994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang                break;
46995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        }
4705994a330ac949e7706540f22cd73d76d9f2a96cbChih-Chung Chang
4713330b203039dea366d4981db1408a460134b2d2cMathias Agopian        if (texture.NPOTAdjust) {
4723330b203039dea366d4981db1408a460134b2d2cMathias Agopian            glScalef(texture.wScale, texture.hScale, 1.0f);
47395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        }
474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
47695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glVertexPointer(2, GL_FIXED, 0, mVertices);
47795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glTexCoordPointer(2, GL_FIXED, 0, texCoords);
478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        while (it != end) {
48095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            const Rect& r = *it++;
48195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            const GLint sy = fbHeight - (r.top + r.height());
48295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            glScissor(r.left, sy, r.width(), r.height());
48395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
48595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
486edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    } else {
48795a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        GLint crop[4] = { 0, height, width, -height };
48895a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
48995a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        int x = tx();
49095a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        int y = ty();
49195a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        y = fbHeight - (y + height);
49295a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian        while (it != end) {
49395a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            const Rect& r = *it++;
49495a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            const GLint sy = fbHeight - (r.top + r.height());
49595a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            glScissor(r.left, sy, r.width(), r.height());
49695a666b0e001ebf738418b89d8e8fd50b18110f8Mathias Agopian            glDrawTexiOES(x, y, 0, width, height);
497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
500edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
501edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid LayerBase::validateTexture(GLint textureName) const
502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    glBindTexture(GL_TEXTURE_2D, textureName);
504edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // TODO: reload the texture if needed
505edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // this is currently done in loadTexture() below
506a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    if (mUseLinearFiltering) {
507a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
508a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
509a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    } else {
510a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
511a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian        glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
512a2fe0a234bd6823f868742a3c137acb8875e1b03Mathias Agopian    }
513401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian
514401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    if (needsDithering()) {
515401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glEnable(GL_DITHER);
516401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    } else {
517401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian        glDisable(GL_DITHER);
518401c257fba770a267f637184b1f532b4e03bed20Mathias Agopian    }
519edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52154ed4f6282bdea251455f39b978626026affdbefMathias Agopianbool LayerBase::isSupportedYuvFormat(int format) const
52254ed4f6282bdea251455f39b978626026affdbefMathias Agopian{
52354ed4f6282bdea251455f39b978626026affdbefMathias Agopian    switch (format) {
52454ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_422_SP:
52554ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
52654ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_422_P:
52754ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_420_P:
52854ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_422_I:
52954ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCbCr_420_I:
53054ed4f6282bdea251455f39b978626026affdbefMathias Agopian        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
53154ed4f6282bdea251455f39b978626026affdbefMathias Agopian            return true;
53254ed4f6282bdea251455f39b978626026affdbefMathias Agopian    }
53354ed4f6282bdea251455f39b978626026affdbefMathias Agopian    return false;
53454ed4f6282bdea251455f39b978626026affdbefMathias Agopian}
53554ed4f6282bdea251455f39b978626026affdbefMathias Agopian
5363330b203039dea366d4981db1408a460134b2d2cMathias Agopianvoid LayerBase::loadTexture(Texture* texture,
5371fed11c86a9d59d0f5282ae8ae25ceba2f802fddMathias Agopian        const Region& dirty, const GGLSurface& t) const
538edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
5393330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (texture->name == -1U) {
5403330b203039dea366d4981db1408a460134b2d2cMathias Agopian        // uh?
5413330b203039dea366d4981db1408a460134b2d2cMathias Agopian        return;
5423330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
54357720c384af81327d327ef8b88078f11a750fd05Mathias Agopian
5443330b203039dea366d4981db1408a460134b2d2cMathias Agopian    glBindTexture(GL_TEXTURE_2D, texture->name);
545edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
546edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
547edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * In OpenGL ES we can't specify a stride with glTexImage2D (however,
548076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian     * GL_UNPACK_ALIGNMENT is a limited form of stride).
549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * So if the stride here isn't representable with GL_UNPACK_ALIGNMENT, we
550edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * need to do something reasonable (here creating a bigger texture).
551edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
552edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * extra pixels = (((stride - width) * pixelsize) / GL_UNPACK_ALIGNMENT);
553edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
554edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * This situation doesn't happen often, but some h/w have a limitation
555edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * for their framebuffer (eg: must be multiple of 8 pixels), and
556edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * we need to take that into account when using these buffers as
557edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * textures.
558edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     *
559edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * This should never be a problem with POT textures
560edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
561076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
562076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    int unpack = __builtin_ctz(t.stride * bytesPerPixel(t.format));
563076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    unpack = 1 << ((unpack > 3) ? 3 : unpack);
564076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    glPixelStorei(GL_UNPACK_ALIGNMENT, unpack);
565076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
566edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    /*
567edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     * round to POT if needed
568edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project     */
5693330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (!(mFlags & DisplayHardware::NPOT_EXTENSION)) {
5703330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->NPOTAdjust = true;
5713330b203039dea366d4981db1408a460134b2d2cMathias Agopian    }
572edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
5733330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (texture->NPOTAdjust) {
574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        // find the smallest power-of-two that will accommodate our surface
5753330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->potWidth  = 1 << (31 - clz(t.width));
5763330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->potHeight = 1 << (31 - clz(t.height));
5773330b203039dea366d4981db1408a460134b2d2cMathias Agopian        if (texture->potWidth  < t.width)  texture->potWidth  <<= 1;
5783330b203039dea366d4981db1408a460134b2d2cMathias Agopian        if (texture->potHeight < t.height) texture->potHeight <<= 1;
5793330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->wScale = float(t.width)  / texture->potWidth;
5803330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->hScale = float(t.height) / texture->potHeight;
5813330b203039dea366d4981db1408a460134b2d2cMathias Agopian    } else {
5823330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->potWidth  = t.width;
5833330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->potHeight = t.height;
584edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
5853330b203039dea366d4981db1408a460134b2d2cMathias Agopian
586076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Rect bounds(dirty.bounds());
587076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    GLvoid* data = 0;
5883330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (texture->width != t.width || texture->height != t.height) {
5893330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->width  = t.width;
5903330b203039dea366d4981db1408a460134b2d2cMathias Agopian        texture->height = t.height;
591076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
5923330b203039dea366d4981db1408a460134b2d2cMathias Agopian        // texture size changed, we need to create a new one
5933330b203039dea366d4981db1408a460134b2d2cMathias Agopian        bounds.set(Rect(t.width, t.height));
5943330b203039dea366d4981db1408a460134b2d2cMathias Agopian        if (t.width  == texture->potWidth &&
5953330b203039dea366d4981db1408a460134b2d2cMathias Agopian            t.height == texture->potHeight) {
5963330b203039dea366d4981db1408a460134b2d2cMathias Agopian            // we can do it one pass
5973330b203039dea366d4981db1408a460134b2d2cMathias Agopian            data = t.data;
598edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
5993330b203039dea366d4981db1408a460134b2d2cMathias Agopian
60054ed4f6282bdea251455f39b978626026affdbefMathias Agopian        if (t.format == HAL_PIXEL_FORMAT_RGB_565) {
601076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexImage2D(GL_TEXTURE_2D, 0,
6023330b203039dea366d4981db1408a460134b2d2cMathias Agopian                    GL_RGB, texture->potWidth, texture->potHeight, 0,
603076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGB, GL_UNSIGNED_SHORT_5_6_5, data);
60454ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) {
605076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexImage2D(GL_TEXTURE_2D, 0,
6063330b203039dea366d4981db1408a460134b2d2cMathias Agopian                    GL_RGBA, texture->potWidth, texture->potHeight, 0,
607076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, data);
60854ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 ||
60954ed4f6282bdea251455f39b978626026affdbefMathias Agopian                   t.format == HAL_PIXEL_FORMAT_RGBX_8888) {
610076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexImage2D(GL_TEXTURE_2D, 0,
6113330b203039dea366d4981db1408a460134b2d2cMathias Agopian                    GL_RGBA, texture->potWidth, texture->potHeight, 0,
612076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGBA, GL_UNSIGNED_BYTE, data);
61354ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (isSupportedYuvFormat(t.format)) {
614076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            // just show the Y plane of YUV buffers
615076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexImage2D(GL_TEXTURE_2D, 0,
6163330b203039dea366d4981db1408a460134b2d2cMathias Agopian                    GL_LUMINANCE, texture->potWidth, texture->potHeight, 0,
617076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
618076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        } else {
619076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            // oops, we don't handle this format!
620076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            LOGE("layer %p, texture=%d, using format %d, which is not "
6213330b203039dea366d4981db1408a460134b2d2cMathias Agopian                 "supported by the GL", this, texture->name, t.format);
622076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
623076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
6243330b203039dea366d4981db1408a460134b2d2cMathias Agopian    if (!data) {
62554ed4f6282bdea251455f39b978626026affdbefMathias Agopian        if (t.format == HAL_PIXEL_FORMAT_RGB_565) {
626076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexSubImage2D(GL_TEXTURE_2D, 0,
627076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    0, bounds.top, t.width, bounds.height(),
628076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
629076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    t.data + bounds.top*t.stride*2);
63054ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (t.format == HAL_PIXEL_FORMAT_RGBA_4444) {
631076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexSubImage2D(GL_TEXTURE_2D, 0,
632076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    0, bounds.top, t.width, bounds.height(),
633076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
634076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    t.data + bounds.top*t.stride*2);
63554ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (t.format == HAL_PIXEL_FORMAT_RGBA_8888 ||
63654ed4f6282bdea251455f39b978626026affdbefMathias Agopian                   t.format == HAL_PIXEL_FORMAT_RGBX_8888) {
637076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexSubImage2D(GL_TEXTURE_2D, 0,
638076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    0, bounds.top, t.width, bounds.height(),
639076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_RGBA, GL_UNSIGNED_BYTE,
640076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    t.data + bounds.top*t.stride*4);
64154ed4f6282bdea251455f39b978626026affdbefMathias Agopian        } else if (isSupportedYuvFormat(t.format)) {
642076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            // just show the Y plane of YUV buffers
643076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            glTexSubImage2D(GL_TEXTURE_2D, 0,
644076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    0, bounds.top, t.width, bounds.height(),
645076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    GL_LUMINANCE, GL_UNSIGNED_BYTE,
646076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian                    t.data + bounds.top*t.stride);
647edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
648edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
649edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
650edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
65154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopianstatus_t LayerBase::initializeEglImage(
65254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        const sp<GraphicBuffer>& buffer, Texture* texture)
65354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian{
65454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    status_t err = NO_ERROR;
65554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
65654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    // we need to recreate the texture
65754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    EGLDisplay dpy(mFlinger->graphicPlane(0).getEGLDisplay());
65854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
65954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    // free the previous image
66054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    if (texture->image != EGL_NO_IMAGE_KHR) {
66154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        eglDestroyImageKHR(dpy, texture->image);
66254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        texture->image = EGL_NO_IMAGE_KHR;
66354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    }
66454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
66554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    // construct an EGL_NATIVE_BUFFER_ANDROID
66654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    android_native_buffer_t* clientBuf = buffer->getNativeBuffer();
66754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
66854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    // create the new EGLImageKHR
66954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    const EGLint attrs[] = {
67054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            EGL_IMAGE_PRESERVED_KHR,    EGL_TRUE,
67154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            EGL_NONE,                   EGL_NONE
67254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    };
67354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    texture->image = eglCreateImageKHR(
67454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            dpy, EGL_NO_CONTEXT, EGL_NATIVE_BUFFER_ANDROID,
67554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            (EGLClientBuffer)clientBuf, attrs);
67654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
67754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    if (texture->image != EGL_NO_IMAGE_KHR) {
67854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        glBindTexture(GL_TEXTURE_2D, texture->name);
67954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        glEGLImageTargetTexture2DOES(GL_TEXTURE_2D,
68054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian                (GLeglImageOES)texture->image);
68154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        GLint error = glGetError();
68254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        if (UNLIKELY(error != GL_NO_ERROR)) {
68354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            LOGE("layer=%p, glEGLImageTargetTexture2DOES(%p) "
68454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian                 "failed err=0x%04x",
68554ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian                 this, texture->image, error);
68654ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            err = INVALID_OPERATION;
68754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        } else {
68854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            // Everything went okay!
68954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            texture->NPOTAdjust = false;
69054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            texture->dirty  = false;
69154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            texture->width  = clientBuf->width;
69254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian            texture->height = clientBuf->height;
69354ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        }
69454ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    } else {
695fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian        LOGE("layer=%p, eglCreateImageKHR() failed. err=0x%4x",
696fcfeb4b5970c8f361634429934a2518d7e8328ddMathias Agopian                this, eglGetError());
69754ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian        err = INVALID_OPERATION;
69854ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    }
69954ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian    return err;
70054ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian}
70154ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
70254ba51dff21de666c5ae3bf3abd4f0634ebb0676Mathias Agopian
703edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
704edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
7052e123245811a1f31c080a29728fcc1655045f011Mathias Agopianint32_t LayerBaseClient::sIdentity = 0;
7062e123245811a1f31c080a29728fcc1655045f011Mathias Agopian
707edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::LayerBaseClient(SurfaceFlinger* flinger, DisplayID display,
708f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian        const sp<Client>& client, int32_t i)
709d12965934712ed0b9c1a264a6934dc0dad839ffdMathias Agopian    : LayerBase(flinger, display), lcblk(NULL), client(client), mIndex(i),
710948d69fca450a5a85e3e3e17d5776bfb26e48b85Mathias Agopian      mIdentity(uint32_t(android_atomic_inc(&sIdentity)))
711edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
71248d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian    lcblk = new SharedBufferServer(
71348d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian            client->ctrlblk, i, NUM_BUFFERS,
71448d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian            mIdentity);
715076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
716edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
717076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::onFirstRef()
718076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
719f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
720f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
721076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        client->bindLayer(this, mIndex);
722edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
723edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
724edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
725edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectLayerBaseClient::~LayerBaseClient()
726edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
727f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
728f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
729edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        client->free(mIndex);
730edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
73148d819a1315f7d1b5abfec9d4fd34fb5aed27b1dMathias Agopian    delete lcblk;
732edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
733edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
734f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopianint32_t LayerBaseClient::serverIndex() const
735f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian{
736f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    sp<Client> client(this->client.promote());
737f9d932774e06d5122c48b47d8cabd791783f56d2Mathias Agopian    if (client != 0) {
738edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        return (client->cid<<16)|mIndex;
739edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
740edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return 0xFFFF0000 | mIndex;
741edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
742edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
743076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::getSurface()
744076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
745076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<Surface> s;
746076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    Mutex::Autolock _l(mLock);
747076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    s = mClientSurface.promote();
748076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    if (s == 0) {
749076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        s = createSurface();
750076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        mClientSurface = s;
751076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
752076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return s;
753076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
754076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
755076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient::Surface> LayerBaseClient::createSurface() const
756076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
7579a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    return new Surface(mFlinger, clientIndex(), mIdentity,
758076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            const_cast<LayerBaseClient *>(this));
759076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
760076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
7610b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// called with SurfaceFlinger::mStateLock as soon as the layer is entered
7620b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian// in the purgatory list
7630b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopianvoid LayerBaseClient::onRemoved()
7640b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian{
7650b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian    // wake up the condition
7660b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian    lcblk->setStatus(NO_INIT);
7670b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian}
7680b3ad46a26dc3717260fa9347c77f673f3198606Mathias Agopian
769076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
770076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
7719a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::Surface(
7729a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        const sp<SurfaceFlinger>& flinger,
7739a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        SurfaceID id, int identity,
774076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const sp<LayerBaseClient>& owner)
7759a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    : mFlinger(flinger), mToken(id), mIdentity(identity), mOwner(owner)
7769a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
777076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
778076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
7799a11206fe793363c0e8897b478cbe6ef8c52b543Mathias AgopianLayerBaseClient::Surface::~Surface()
7809a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian{
7819a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    /*
7829a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     * This is a good place to clean-up all client resources
7839a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian     */
7849a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian
7859a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    // destroy client resources
7869a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    sp<LayerBaseClient> layer = getOwner();
7879a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    if (layer != 0) {
7889a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian        mFlinger->destroySurface(layer);
7899a11206fe793363c0e8897b478cbe6ef8c52b543Mathias Agopian    }
790076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
791076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
792076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<LayerBaseClient> LayerBaseClient::Surface::getOwner() const {
793076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    sp<LayerBaseClient> owner(mOwner.promote());
794076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return owner;
795076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
796076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
797076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::onTransact(
798375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian        uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
799076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
800076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    switch (code) {
801076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case REGISTER_BUFFERS:
802076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case UNREGISTER_BUFFERS:
803076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        case CREATE_OVERLAY:
804076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        {
805375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian            if (!mFlinger->mAccessSurfaceFlinger.checkCalling()) {
806375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                IPCThreadState* ipc = IPCThreadState::self();
807375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int pid = ipc->getCallingPid();
808375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                const int uid = ipc->getCallingUid();
809375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                LOGE("Permission Denial: "
810375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                        "can't access SurfaceFlinger pid=%d, uid=%d", pid, uid);
811375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian                return PERMISSION_DENIED;
812076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian            }
813076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        }
814076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    }
815076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return BnSurface::onTransact(code, data, reply, flags);
816076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
817076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
8183330b203039dea366d4981db1408a460134b2d2cMathias Agopiansp<GraphicBuffer> LayerBaseClient::Surface::requestBuffer(int index, int usage)
819076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
820076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
821076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
822076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
823076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianstatus_t LayerBaseClient::Surface::registerBuffers(
824076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        const ISurface::BufferHeap& buffers)
825076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
826076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return INVALID_OPERATION;
827076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
828076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
829076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::postBuffer(ssize_t offset)
830076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
831076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
832076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
833076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopianvoid LayerBaseClient::Surface::unregisterBuffers()
834076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
835076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian}
836076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
837076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopiansp<OverlayRef> LayerBaseClient::Surface::createOverlay(
83852e7200b6e020bba978c36e3a928493a3f2c8a92Chih-Chung Chang        uint32_t w, uint32_t h, int32_t format, int32_t orientation)
839076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
840076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian    return NULL;
841076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian};
842edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
843edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
844edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
845edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
846