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#ifndef ANDROID_GUI_SURFACE_CONTROL_H
18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#define ANDROID_GUI_SURFACE_CONTROL_H
19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
20e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <stdint.h>
21e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/types.h>
22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/KeyedVector.h>
24e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/RefBase.h>
25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/threads.h>
26e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
27d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav#include <ui/FrameStats.h>
28e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/PixelFormat.h>
29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Region.h>
30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
31e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/ISurfaceComposerClient.h>
3213fdc49516d17f41e64e62e73c313b0928bf13ccchaviw#include <math/vec3.h>
33e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android {
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
36e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------
37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass IGraphicBufferProducer;
39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass Surface;
40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass SurfaceComposerClient;
41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
42e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------
43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass SurfaceControl : public RefBase
45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianpublic:
47f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi    static sp<SurfaceControl> readFromParcel(Parcel* parcel);
48f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi    void writeToParcel(Parcel* parcel);
49f3cf4bcfa2c558f03e178f7044d3cb12fa0e73edJorim Jaggi
50e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static bool isValid(const sp<SurfaceControl>& surface) {
51e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        return (surface != 0) && surface->isValid();
52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
534d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    bool isValid() {
554d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        return mHandle!=0 && mClient!=0;
56e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
574d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static bool isSameSurface(
59e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
60d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // release surface data from java
62e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    void        clear();
63d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
641b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang    // disconnect any api that's connected
651b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang    void        disconnect();
661b3a9acb77ee12568fa19740d8eeab165a0dcd98Chong Zhang
67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static status_t writeSurfaceToParcel(
68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceControl>& control, Parcel* parcel);
69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> getSurface() const;
714e623e259c3e8677d57f761a3708423fb2e77e2aBryce Lee    sp<Surface> createSurface() const;
727dde599bf1a0dbef7390d91c2689d506371cdbd7Dan Stoza    sp<IBinder> getHandle() const;
73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
74d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t clearLayerFrameStats() const;
75d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t getLayerFrameStats(FrameStats* outStats) const;
76d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
774cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr    sp<SurfaceComposerClient> getClient() const;
784cdc58f6840d15b4952149d2b345ec1f97d505bcRobert Carr
79e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianprivate:
80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // can't be copied
81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl& operator = (SurfaceControl& rhs);
82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl(const SurfaceControl& rhs);
83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    friend class SurfaceComposerClient;
85e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    friend class Surface;
86e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
87e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl(
88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceComposerClient>& client,
894d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            const sp<IBinder>& handle,
900b26710528eb69f3883f295f3e6146e6466fd082Jorim Jaggi            const sp<IGraphicBufferProducer>& gbp,
910b26710528eb69f3883f295f3e6146e6466fd082Jorim Jaggi            bool owned);
92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
93e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    ~SurfaceControl();
94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
954e623e259c3e8677d57f761a3708423fb2e77e2aBryce Lee    sp<Surface> generateSurfaceLocked() const;
96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t validate() const;
97e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    void destroy();
98d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
99e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<SurfaceComposerClient>   mClient;
1004d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    sp<IBinder>                 mHandle;
101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<IGraphicBufferProducer>  mGraphicBufferProducer;
102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mutable Mutex               mLock;
103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mutable sp<Surface>         mSurfaceData;
1040b26710528eb69f3883f295f3e6146e6466fd082Jorim Jaggi    bool                        mOwned;
105e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian};
106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}; // namespace android
108e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
109e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#endif // ANDROID_GUI_SURFACE_CONTROL_H
110