xref: /aosp_15_r20/frameworks/native/include/gui/SurfaceControl.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2007 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef ANDROID_GUI_SURFACE_CONTROL_H
18*38e8c45fSAndroid Build Coastguard Worker #define ANDROID_GUI_SURFACE_CONTROL_H
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <sys/types.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <optional>
23*38e8c45fSAndroid Build Coastguard Worker 
24*38e8c45fSAndroid Build Coastguard Worker #include <utils/RefBase.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <utils/threads.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker #include <android/gui/ISurfaceComposerClient.h>
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker #include <ui/FrameStats.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <ui/PixelFormat.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <ui/Region.h>
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker #include <math/vec3.h>
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker namespace android {
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker class Choreographer;
40*38e8c45fSAndroid Build Coastguard Worker class IGraphicBufferProducer;
41*38e8c45fSAndroid Build Coastguard Worker class Surface;
42*38e8c45fSAndroid Build Coastguard Worker class SurfaceComposerClient;
43*38e8c45fSAndroid Build Coastguard Worker class BLASTBufferQueue;
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
46*38e8c45fSAndroid Build Coastguard Worker 
47*38e8c45fSAndroid Build Coastguard Worker class SurfaceControl : public RefBase
48*38e8c45fSAndroid Build Coastguard Worker {
49*38e8c45fSAndroid Build Coastguard Worker public:
50*38e8c45fSAndroid Build Coastguard Worker     static status_t readFromParcel(const Parcel& parcel, sp<SurfaceControl>* outSurfaceControl);
51*38e8c45fSAndroid Build Coastguard Worker     status_t writeToParcel(Parcel& parcel);
52*38e8c45fSAndroid Build Coastguard Worker 
53*38e8c45fSAndroid Build Coastguard Worker     static status_t readNullableFromParcel(const Parcel& parcel,
54*38e8c45fSAndroid Build Coastguard Worker                                            sp<SurfaceControl>* outSurfaceControl);
55*38e8c45fSAndroid Build Coastguard Worker     static status_t writeNullableToParcel(Parcel& parcel, const sp<SurfaceControl>& surfaceControl);
56*38e8c45fSAndroid Build Coastguard Worker 
isValid(const sp<SurfaceControl> & surface)57*38e8c45fSAndroid Build Coastguard Worker     static bool isValid(const sp<SurfaceControl>& surface) {
58*38e8c45fSAndroid Build Coastguard Worker         return (surface != nullptr) && surface->isValid();
59*38e8c45fSAndroid Build Coastguard Worker     }
60*38e8c45fSAndroid Build Coastguard Worker 
isValid()61*38e8c45fSAndroid Build Coastguard Worker     bool isValid() {
62*38e8c45fSAndroid Build Coastguard Worker         return mHandle!=nullptr && mClient!=nullptr;
63*38e8c45fSAndroid Build Coastguard Worker     }
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker     static bool isSameSurface(
66*38e8c45fSAndroid Build Coastguard Worker             const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
67*38e8c45fSAndroid Build Coastguard Worker 
68*38e8c45fSAndroid Build Coastguard Worker     // Reparent off-screen and release. This is invoked by the destructor.
69*38e8c45fSAndroid Build Coastguard Worker     void destroy();
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker     // disconnect any api that's connected
72*38e8c45fSAndroid Build Coastguard Worker     void        disconnect();
73*38e8c45fSAndroid Build Coastguard Worker 
74*38e8c45fSAndroid Build Coastguard Worker     static status_t writeSurfaceToParcel(
75*38e8c45fSAndroid Build Coastguard Worker             const sp<SurfaceControl>& control, Parcel* parcel);
76*38e8c45fSAndroid Build Coastguard Worker 
77*38e8c45fSAndroid Build Coastguard Worker     sp<Surface> getSurface();
78*38e8c45fSAndroid Build Coastguard Worker     sp<Surface> createSurface();
79*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> getHandle() const;
80*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> getLayerStateHandle() const;
81*38e8c45fSAndroid Build Coastguard Worker     int32_t getLayerId() const;
82*38e8c45fSAndroid Build Coastguard Worker     const std::string& getName() const;
83*38e8c45fSAndroid Build Coastguard Worker 
84*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/267195698): Consider renaming.
85*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<Choreographer> getChoreographer();
86*38e8c45fSAndroid Build Coastguard Worker 
87*38e8c45fSAndroid Build Coastguard Worker     sp<IGraphicBufferProducer> getIGraphicBufferProducer();
88*38e8c45fSAndroid Build Coastguard Worker 
89*38e8c45fSAndroid Build Coastguard Worker     status_t clearLayerFrameStats() const;
90*38e8c45fSAndroid Build Coastguard Worker     status_t getLayerFrameStats(FrameStats* outStats) const;
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceComposerClient> getClient() const;
93*38e8c45fSAndroid Build Coastguard Worker 
94*38e8c45fSAndroid Build Coastguard Worker     uint32_t getTransformHint() const;
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker     void setTransformHint(uint32_t hint);
97*38e8c45fSAndroid Build Coastguard Worker     void updateDefaultBufferSize(uint32_t width, uint32_t height);
98*38e8c45fSAndroid Build Coastguard Worker 
99*38e8c45fSAndroid Build Coastguard Worker     explicit SurfaceControl(const sp<SurfaceControl>& other);
100*38e8c45fSAndroid Build Coastguard Worker 
101*38e8c45fSAndroid Build Coastguard Worker     SurfaceControl(const sp<SurfaceComposerClient>& client, const sp<IBinder>& handle,
102*38e8c45fSAndroid Build Coastguard Worker                    int32_t layerId, const std::string& layerName, uint32_t width = 0,
103*38e8c45fSAndroid Build Coastguard Worker                    uint32_t height = 0, PixelFormat format = 0, uint32_t transformHint = 0,
104*38e8c45fSAndroid Build Coastguard Worker                    uint32_t flags = 0);
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceControl> getParentingLayer();
107*38e8c45fSAndroid Build Coastguard Worker 
108*38e8c45fSAndroid Build Coastguard Worker     uint64_t resolveFrameNumber(const std::optional<uint64_t>& frameNumber);
109*38e8c45fSAndroid Build Coastguard Worker 
110*38e8c45fSAndroid Build Coastguard Worker private:
111*38e8c45fSAndroid Build Coastguard Worker     // can't be copied
112*38e8c45fSAndroid Build Coastguard Worker     SurfaceControl& operator = (SurfaceControl& rhs);
113*38e8c45fSAndroid Build Coastguard Worker     SurfaceControl(const SurfaceControl& rhs);
114*38e8c45fSAndroid Build Coastguard Worker 
115*38e8c45fSAndroid Build Coastguard Worker     friend class SurfaceComposerClient;
116*38e8c45fSAndroid Build Coastguard Worker     friend class Surface;
117*38e8c45fSAndroid Build Coastguard Worker 
118*38e8c45fSAndroid Build Coastguard Worker     ~SurfaceControl();
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     sp<Surface> generateSurfaceLocked();
121*38e8c45fSAndroid Build Coastguard Worker     status_t validate() const;
122*38e8c45fSAndroid Build Coastguard Worker 
123*38e8c45fSAndroid Build Coastguard Worker     sp<SurfaceComposerClient>   mClient;
124*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> mHandle;
125*38e8c45fSAndroid Build Coastguard Worker     mutable Mutex               mLock;
126*38e8c45fSAndroid Build Coastguard Worker     mutable sp<Surface>         mSurfaceData;
127*38e8c45fSAndroid Build Coastguard Worker     mutable sp<BLASTBufferQueue> mBbq;
128*38e8c45fSAndroid Build Coastguard Worker     mutable sp<SurfaceControl> mBbqChild;
129*38e8c45fSAndroid Build Coastguard Worker     int32_t mLayerId = 0;
130*38e8c45fSAndroid Build Coastguard Worker     std::string mName;
131*38e8c45fSAndroid Build Coastguard Worker     uint32_t mTransformHint = 0;
132*38e8c45fSAndroid Build Coastguard Worker     uint32_t mWidth = 0;
133*38e8c45fSAndroid Build Coastguard Worker     uint32_t mHeight = 0;
134*38e8c45fSAndroid Build Coastguard Worker     PixelFormat mFormat = PIXEL_FORMAT_NONE;
135*38e8c45fSAndroid Build Coastguard Worker     uint32_t mCreateFlags = 0;
136*38e8c45fSAndroid Build Coastguard Worker     uint64_t mFallbackFrameNumber = 100;
137*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<Choreographer> mChoreographer;
138*38e8c45fSAndroid Build Coastguard Worker };
139*38e8c45fSAndroid Build Coastguard Worker 
140*38e8c45fSAndroid Build Coastguard Worker }; // namespace android
141*38e8c45fSAndroid Build Coastguard Worker 
142*38e8c45fSAndroid Build Coastguard Worker #endif // ANDROID_GUI_SURFACE_CONTROL_H
143