1e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian/*
2e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Copyright (C) 2007 The Android Open Source Project
3e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
4e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * you may not use this file except in compliance with the License.
6e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * You may obtain a copy of the License at
7e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
8e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
10e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Unless required by applicable law or agreed to in writing, software
11e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * See the License for the specific language governing permissions and
14e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * limitations under the License.
15e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian */
16e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
17e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#define LOG_TAG "SurfaceControl"
18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <stdint.h>
20e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <errno.h>
21e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/types.h>
22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/stat.h>
23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
24e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <android/native_window.h>
25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
26e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Errors.h>
27e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/Log.h>
28e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/threads.h>
29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <binder/IPCThreadState.h>
31e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
32e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/DisplayInfo.h>
33e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/GraphicBuffer.h>
34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Rect.h>
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
361b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang#include <gui/BufferQueueCore.h>
37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/ISurfaceComposer.h>
38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/Surface.h>
39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceComposerClient.h>
40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/SurfaceControl.h>
41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
42e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android {
43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================
45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian//  SurfaceControl
46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ============================================================================
47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::SurfaceControl(
4983cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall        const sp<SurfaceComposerClient>& client,
504d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const sp<IBinder>& handle,
514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        const sp<IGraphicBufferProducer>& gbp)
524d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    : mClient(client), mHandle(handle), mGraphicBufferProducer(gbp)
53e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
5583cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall
56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias AgopianSurfaceControl::~SurfaceControl()
57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    destroy();
59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianvoid SurfaceControl::destroy()
62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (isValid()) {
644d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        mClient->destroySurface(mHandle);
65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // clear all references and trigger an IPC now, to make sure things
67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // happen without delay, since these resources are quite heavy.
68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mClient.clear();
694d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    mHandle.clear();
70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mGraphicBufferProducer.clear();
71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    IPCThreadState::self()->flushCommands();
72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
7483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hallvoid SurfaceControl::clear()
75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
76e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // here, the window manager tells us explicitly that we should destroy
77e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // the surface's resource. Soon after this call, it will also release
78e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // its last reference (which will call the dtor); however, it is possible
79e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // that a client living in the same process still holds references which
80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // would delay the call to the dtor -- that is why we need this explicit
81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // "clear()" call.
82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    destroy();
83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
851b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhangvoid SurfaceControl::disconnect() {
861b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang    if (mGraphicBufferProducer != NULL) {
871b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang        mGraphicBufferProducer->disconnect(
881b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang                BufferQueueCore::CURRENTLY_CONNECTED_API);
891b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang    }
901b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang}
911b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang
92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianbool SurfaceControl::isSameSurface(
9383cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall        const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs)
94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
95e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (lhs == 0 || rhs == 0)
96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        return false;
974d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    return lhs->mHandle == rhs->mHandle;
98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
100d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t SurfaceControl::setLayerStack(uint32_t layerStack) {
101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1033b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setLayerStack(mHandle, layerStack);
104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
105d723bd7669b4fc88dc282d8bf8ba5ecb2849d22fDan Stozastatus_t SurfaceControl::setLayer(uint32_t layer) {
106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1083b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setLayer(mHandle, layer);
109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
110d6480c020b050c777ec1db2dd9c16fccfc47b47bRamanan Rajeswaranstatus_t SurfaceControl::setPosition(float x, float y) {
111e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
112e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1133b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setPosition(mHandle, x, y);
114e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
11599e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carrstatus_t SurfaceControl::setGeometryAppliesWithResize() {
11682364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    status_t err = validate();
11782364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr    if (err < 0) return err;
11899e27f0bc236e38d88ff4f9912ede514a729b8ebRobert Carr    return mClient->setGeometryAppliesWithResize(mHandle);
11982364e3cea0bf88fa8147766433329b3dd5148b8Robert Carr}
120e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setSize(uint32_t w, uint32_t h) {
121e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
122e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1233b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setSize(mHandle, w, h);
124e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
125e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::hide() {
126e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
127e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1283b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->hide(mHandle);
129e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
130e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::show() {
131e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
132e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1333b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->show(mHandle);
134e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
135e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setFlags(uint32_t flags, uint32_t mask) {
136e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
137e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1383b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setFlags(mHandle, flags, mask);
139e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
140e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setTransparentRegionHint(const Region& transparent) {
141e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
142e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1433b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setTransparentRegionHint(mHandle, transparent);
144e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
145e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setAlpha(float alpha) {
146e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
147e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1483b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setAlpha(mHandle, alpha);
149e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
150e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setMatrix(float dsdx, float dtdx, float dsdy, float dtdy) {
151e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
152e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1533b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setMatrix(mHandle, dsdx, dtdx, dsdy, dtdy);
154e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
155e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::setCrop(const Rect& crop) {
156e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t err = validate();
157e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (err < 0) return err;
1583b3ba78c3c586c2b09b11e0f1ab5347ff51a21e0Dan Stoza    return mClient->setCrop(mHandle, crop);
159e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
160acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballosstatus_t SurfaceControl::setFinalCrop(const Rect& crop) {
161acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    status_t err = validate();
162acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    if (err < 0) return err;
163acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos    return mClient->setFinalCrop(mHandle, crop);
164acbe67888f0bd65d5400400f0115bae6bd6199dcPablo Ceballos}
165e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
1667dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozastatus_t SurfaceControl::deferTransactionUntil(sp<IBinder> handle,
1677dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza        uint64_t frameNumber) {
1687dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    status_t err = validate();
1697dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    if (err < 0) return err;
1707dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return mClient->deferTransactionUntil(mHandle, handle, frameNumber);
1717dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
1727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
173c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carrstatus_t SurfaceControl::setOverrideScalingMode(int32_t overrideScalingMode) {
174c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    status_t err = validate();
175c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    if (err < 0) return err;
176c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr    return mClient->setOverrideScalingMode(mHandle, overrideScalingMode);
177c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr}
178c3574f7b0141c69fdca25ccafb80ff334462f9a3Robert Carr
179d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceControl::clearLayerFrameStats() const {
180d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t err = validate();
181d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    if (err < 0) return err;
182d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    const sp<SurfaceComposerClient>& client(mClient);
183d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return client->clearLayerFrameStats(mHandle);
184d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
185d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
186d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslavstatus_t SurfaceControl::getLayerFrameStats(FrameStats* outStats) const {
187d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t err = validate();
188d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    if (err < 0) return err;
189d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    const sp<SurfaceComposerClient>& client(mClient);
190d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    return client->getLayerFrameStats(mHandle, outStats);
191d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav}
192d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
193367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carrstatus_t SurfaceControl::getTransformToDisplayInverse(bool* outTransformToDisplayInverse) const {
194367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    status_t err = validate();
195367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    if (err < 0) return err;
196367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    const sp<SurfaceComposerClient>& client(mClient);
197367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr    return client->getTransformToDisplayInverse(mHandle, outTransformToDisplayInverse);
198367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr}
199367c5684f4d417e5176bec12d67f4e2e42738fe0Robert Carr
200e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::validate() const
201e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
2024d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    if (mHandle==0 || mClient==0) {
2034d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        ALOGE("invalid handle (%p) or client (%p)",
2044d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian                mHandle.get(), mClient.get());
205e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        return NO_INIT;
206e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
207e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    return NO_ERROR;
208e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
209e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
210e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianstatus_t SurfaceControl::writeSurfaceToParcel(
211e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        const sp<SurfaceControl>& control, Parcel* parcel)
212e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
213e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<IGraphicBufferProducer> bp;
214e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (control != NULL) {
215e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        bp = control->mGraphicBufferProducer;
216e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
2172ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen    return parcel->writeStrongBinder(IInterface::asBinder(bp));
218e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
219e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
220e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiansp<Surface> SurfaceControl::getSurface() const
221e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
222e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    Mutex::Autolock _l(mLock);
223e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    if (mSurfaceData == 0) {
22483cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall        // This surface is always consumed by SurfaceFlinger, so the
22583cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall        // producerControlledByApp value doesn't matter; using false.
22683cafffeac037ab2f9d00f98f8d2f3da8fc9b857Jesse Hall        mSurfaceData = new Surface(mGraphicBufferProducer, false);
227e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
228e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    return mSurfaceData;
229e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}
230e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
2317dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stozasp<IBinder> SurfaceControl::getHandle() const
2327dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza{
2337dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    Mutex::Autolock lock(mLock);
2347dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    return mHandle;
2357dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza}
2367dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza
237e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ----------------------------------------------------------------------------
238e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}; // namespace android
239