• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
17 #define FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
18 
19 #include <buffer_extra_data.h>
20 #include <buffer_handle_parcel.h>
21 #include <buffer_handle_utils.h>
22 #include <surface_buffer.h>
23 #include "egl_data.h"
24 #include "native_buffer.h"
25 #include "stdint.h"
26 #include "sync_fence.h"
27 
28 struct BufferWrapper {};
29 
30 namespace OHOS {
31 class SurfaceBufferImpl : public SurfaceBuffer {
32 public:
33     SurfaceBufferImpl();
34     SurfaceBufferImpl(uint32_t seqNum);
35     virtual ~SurfaceBufferImpl();
36 
37     GSError Alloc(const BufferRequestConfig& config, const sptr<SurfaceBuffer>& previousBuffer = nullptr) override;
38     GSError Map() override;
39     GSError Unmap() override;
40     GSError FlushCache() override;
41     GSError InvalidateCache() override;
42 
43     BufferHandle *GetBufferHandle() const override;
44     int32_t GetWidth() const override;
45     int32_t GetHeight() const override;
46     int32_t GetStride() const override;
47     int32_t GetFormat() const override;
48     uint64_t GetUsage() const override;
49     uint64_t GetPhyAddr() const override;
50     void* GetVirAddr() override;
51     int32_t GetFileDescriptor() const override;
52     uint32_t GetSize() const override;
53 
54     GraphicColorGamut GetSurfaceBufferColorGamut() const override;
55     GraphicTransformType GetSurfaceBufferTransform() const override;
56     void SetSurfaceBufferColorGamut(const GraphicColorGamut& colorGamut) override;
57     void SetSurfaceBufferTransform(const GraphicTransformType& transform) override;
58 
59     int32_t GetSurfaceBufferWidth() const override;
60     int32_t GetSurfaceBufferHeight() const override;
61     void SetSurfaceBufferWidth(int32_t width) override;
62     void SetSurfaceBufferHeight(int32_t width) override;
63 
64     uint32_t GetSeqNum() const override;
65 
66     void SetExtraData(sptr<BufferExtraData> bedata) override;
67     sptr<BufferExtraData> GetExtraData() const override;
68 
69     void SetBufferHandle(BufferHandle *handle) override;
70     GSError WriteToMessageParcel(MessageParcel &parcel) override;
71     GSError ReadFromMessageParcel(MessageParcel &parcel,
72         std::function<int(MessageParcel &parcel,
73             std::function<int(Parcel &)>readFdDefaultFunc)>readSafeFdFunc = nullptr) override;
74 
75     OH_NativeBuffer* SurfaceBufferToNativeBuffer() override;
76 
77     static GSError CheckBufferConfig(int32_t width, int32_t height,
78                                      int32_t format, uint64_t usage);
79 
80     // metadata
81     GSError SetMetadata(uint32_t key, const std::vector<uint8_t>& value, bool enableCache = true) override;
82     GSError GetMetadata(uint32_t key, std::vector<uint8_t>& value) override;
83     GSError ListMetadataKeys(std::vector<uint32_t>& keys) override;
84     GSError EraseMetadataKey(uint32_t key) override;
85 
86     void SetCropMetadata(const Rect& crop) override;
87     bool GetCropMetadata(Rect& crop) override;
88 
89     GSError WriteBufferRequestConfig(MessageParcel &parcel) override;
90     GSError ReadBufferRequestConfig(MessageParcel &parcel) override;
91     GSError ReadBufferProperty(MessageParcel& parcel) override;
92     GSError WriteBufferProperty(MessageParcel& parcel) override;
93     GSError ReadFromBufferInfo(const RSBufferInfo &bufferInfo) override;
94     BufferRequestConfig GetBufferRequestConfig() const override;
95     void SetBufferRequestConfig(const BufferRequestConfig &config) override;
96     void SetConsumerAttachBufferFlag(bool value) override;
97     bool GetConsumerAttachBufferFlag() override;
98     GSError GetPlanesInfo(void **planesInfo) override;
99     void SetSurfaceBufferScalingMode(const ScalingMode &scalingMode) override;
100     ScalingMode GetSurfaceBufferScalingMode() const override;
101     void SetBufferDeleteFromCacheFlag(const bool &flag) override;
102     bool GetBufferDeleteFromCacheFlag() const  override;
103 
104     GSError TryReclaim() override;
105     GSError TryResumeIfNeeded() override;
106     bool IsReclaimed() override;
107     void SetAndMergeSyncFence(const sptr<SyncFence>& syncFence) override;
108     sptr<SyncFence> GetSyncFence() const override;
109 private:
110     void FreeBufferHandleLocked();
111     bool MetaDataCachedLocked(const uint32_t key, const std::vector<uint8_t>& value);
112     GSError GetImageLayout(void *layout);
113     static void InitMemMgrMembers();
114     static uint32_t GenerateSequenceNumber(uint32_t& seqNum);
115 
116     BufferHandle *handle_ = nullptr;
117     uint32_t sequenceNumber_ = UINT32_MAX;
118     sptr<BufferExtraData> bedata_ = nullptr;
119     sptr<EglData> eglData_ = nullptr;
120     GraphicColorGamut surfaceBufferColorGamut_ = GraphicColorGamut::GRAPHIC_COLOR_GAMUT_SRGB;
121     GraphicTransformType transform_ = GraphicTransformType::GRAPHIC_ROTATE_NONE;
122     ScalingMode scalingMode_ = ScalingMode::SCALING_MODE_SCALE_TO_WINDOW;
123     int32_t surfaceBufferWidth_ = 0;
124     int32_t surfaceBufferHeight_ = 0;
125     mutable std::mutex mutex_;
126     OH_NativeBuffer_Planes planesInfo_ = {0, {}};
127     BufferRequestConfig bufferRequestConfig_ = {0, 0, 0, 0, 0, 0};
128     bool isConsumerAttachBufferFlag_ = false;
129     std::map<uint32_t, std::vector<uint8_t>> metaDataCache_;
130     Rect crop_ = {0, 0, 0, 0};
131     std::atomic<bool> isBufferDeleteFromCache = false;
132     std::atomic<bool> isReclaimed_ = false;
133     using MemMgrFunctionPtr = int32_t(*)(int32_t, int32_t);
134     static inline void *libMemMgrClientHandle_ = nullptr;
135     static inline MemMgrFunctionPtr reclaimFunc_ = nullptr;
136     static inline MemMgrFunctionPtr resumeFunc_ = nullptr;
137     static inline int32_t ownPid_ = -1;
138     static inline std::atomic<bool> initMemMgrSucceed_ = false;
139     sptr<SyncFence> syncFence_ = nullptr;
140 };
141 } // namespace OHOS
142 
143 #endif // FRAMEWORKS_SURFACE_INCLUDE_SURFACE_BUFFER_IMPL_H
144