1 /*
2  * Copyright (c) 2020-2022 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 GRAPHIC_LITE_SURFACE_BUFFER_IMPL_H
17 #define GRAPHIC_LITE_SURFACE_BUFFER_IMPL_H
18 
19 #include <map>
20 #include <pthread.h>
21 #include "buffer_common.h"
22 #include "ipc_skeleton.h"
23 #include "surface_buffer.h"
24 
25 namespace OHOS {
26 enum BufferState {
27     BUFFER_STATE_NONE = 0,
28     BUFFER_STATE_REQUEST,
29     BUFFER_STATE_FLUSH,
30     BUFFER_STATE_ACQUIRE,
31     BUFFER_STATE_RELEASE
32 };
33 
34 enum BufferDataType {
35     BUFFER_DATA_TYPE_NONE,
36     BUFFER_DATA_TYPE_INT_32,
37     BUFFER_DATA_TYPE_INT_64,
38     BUFFER_DATA_TYPE_MAX,
39 };
40 
41 struct SurfaceBufferHandle {
42     int32_t key;
43     uint64_t phyAddr;
44     int32_t stride;       /* the stride of memory */
45     uint32_t reserveFds;  /* the number of reserved fd value */
46     uint32_t reserveInts; /* the number of reserved integer value */
47     bool operator == (const SurfaceBufferHandle &rHandle) const
48     {
49         return ((key == rHandle.key)
50             && (phyAddr == rHandle.phyAddr));
51     }
52 };
53 
54 struct SurfaceBufferData {
55     SurfaceBufferHandle handle;
56     uint32_t size;
57     uint32_t usage;
58     uint8_t deletePending;
59     BufferState state;
60     void* virAddr;
61     bool operator == (const SurfaceBufferData &rData) const
62     {
63         return handle == rData.handle;
64     }
65 };
66 
67 typedef struct {
68     void* value;
69     uint8_t size;
70     uint8_t type;
71 } ExtraData;
72 
73 /**
74  * @brief Buffer class. Provide shared memory for graphic and multi media to use.
75  */
76 class SurfaceBufferImpl : public SurfaceBuffer {
77 public:
78     /**
79      * @brief Buffer Constructor.
80      */
81     SurfaceBufferImpl();
82 
83     /**
84      * @brief Buffer Destructor.
85      */
86     ~SurfaceBufferImpl();
87 
88     /**
89      * @brief Get buffer key, for shared virtual memory.
90      * @returns The buffer key.
91      */
GetKey()92     int32_t GetKey() const
93     {
94         return bufferData_.handle.key;
95     }
96 
97     /**
98      * @brief Set buffer key, for shared virtual memory.
99      * @param [in] The buffer key
100      */
SetKey(int32_t key)101     void SetKey(int32_t key)
102     {
103         bufferData_.handle.key = key;
104     }
105 
106     /**
107      * @brief Get buffer phyAddr, for shared physical memory.
108      * @returns The buffer phyAddr.
109      */
GetPhyAddr()110     uint64_t GetPhyAddr() const override
111     {
112         return bufferData_.handle.phyAddr;
113     }
114 
115     /**
116      * @brief Set buffer phyAddr, for shared physical memory.
117      * @param [in] The buffer phyAddr
118      */
SetPhyAddr(uint64_t phyAddr)119     void SetPhyAddr(uint64_t phyAddr)
120     {
121         bufferData_.handle.phyAddr = phyAddr;
122     }
123 
124     /**
125      * @brief Get buffer stride, for shared physical memory.
126      * @returns The buffer phyAddr.
127      */
GetStride()128     int32_t GetStride() const
129     {
130         return bufferData_.handle.stride;
131     }
132 
133     /**
134      * @brief Set buffer stride, for shared physical memory.
135      * @param [in] The buffer phyAddr
136      */
SetStride(int32_t stride)137     void SetStride(int32_t stride)
138     {
139         bufferData_.handle.stride = stride;
140     }
141 
142     /**
143      * @brief Get buffer reserveInts, for shared physical memory.
144      * @returns The buffer phyAddr.
145      */
GetReserveInts()146     uint32_t GetReserveInts() const
147     {
148         return bufferData_.handle.reserveInts;
149     }
150 
151     /**
152      * @brief Set buffer reserveInts, for shared physical memory.
153      * @param [in] The buffer phyAddr
154      */
SetReserveInts(uint32_t reserveInts)155     void SetReserveInts(uint32_t reserveInts)
156     {
157         bufferData_.handle.reserveInts = reserveInts;
158     }
159 
160     /**
161      * @brief Get buffer reserveFds, for shared physical memory.
162      * @returns The buffer phyAddr.
163      */
GetReserveFds()164     uint32_t GetReserveFds() const
165     {
166         return bufferData_.handle.reserveFds;
167     }
168 
169     /**
170      * @brief Set buffer reserveFds, for shared physical memory.
171      * @param [in] The buffer phyAddr
172      */
SetReserveFds(uint32_t reserveFds)173     void SetReserveFds(uint32_t reserveFds)
174     {
175         bufferData_.handle.reserveFds = reserveFds;
176     }
177 
178     /**
179      * @brief Set buffer virtual addr.
180      * @param [in] The virtual addr.
181      */
SetVirAddr(void * virAddr)182     void SetVirAddr(void* virAddr)
183     {
184         bufferData_.virAddr = virAddr;
185     }
186 
187     /**
188      * @brief Get buffer virtual addr.
189      * @returns The buffer virtual addr.
190      */
GetVirAddr()191     void* GetVirAddr() const override
192     {
193         return bufferData_.virAddr;
194     }
195 
196     /**
197      * @brief Get buffer size.
198      * @returns The buffer size.
199      */
GetMaxSize()200     uint32_t GetMaxSize() const
201     {
202         return bufferData_.size;
203     }
204 
205     /**
206      * @brief Set buffer size.
207      * @param [in] The buffer size
208      */
SetMaxSize(uint32_t size)209     void SetMaxSize(uint32_t size)
210     {
211         bufferData_.size = size;
212     }
213 
214     /**
215      * @brief Get buffer size.
216      * @returns The buffer size.
217      */
GetSize()218     uint32_t GetSize() const override
219     {
220         if (len_ == 0) {
221             return bufferData_.size;
222         }
223         return len_;
224     }
225 
226     /**
227      * @brief Set buffer size.
228      * @param [in] The buffer size
229      */
SetSize(uint32_t size)230     void SetSize(uint32_t size) override
231     {
232         if (size > bufferData_.size) {
233             GRAPHIC_LOGI("Input param is invalid");
234             return;
235         }
236         len_ = size;
237     }
238 
239     /**
240      * @brief Get buffer usage. Surface alloc physical or virtual memory buffer.
241      *        All usage sees detail in OHOS::BUFFER_CONSUMER_USAGE.
242      * @returns The buffer usage.
243      */
GetUsage()244     uint32_t GetUsage() const
245     {
246         return bufferData_.usage;
247     }
248 
249     /**
250      * @brief Set buffer usage. Surface alloc physical or virtual memory buffer.
251      *        Support usage see detail in OHOS::BUFFER_CONSUMER_USAGE.
252      *        Default is BUFFER_CONSUMER_USAGE_SORTWARE, which will alloc virtual memory buffer.
253      * @param [in] The buffer usage.
254      */
SetUsage(uint32_t usage)255     void SetUsage(uint32_t usage)
256     {
257         bufferData_.usage = usage;
258     }
259 
260     /**
261      * @brief Get buffer delete state. If deletePending == 1, buffer will be freed when state == BUFFER_STATE_FREE.
262      * @returns [in] The buffer delete state
263      */
GetDeletePending()264     uint8_t GetDeletePending() const
265     {
266         return bufferData_.deletePending;
267     }
268 
269     /**
270      * @brief Set buffer delete state. If deletePending == 1, buffer will be freed when state == BUFFER_STATE_FREE.
271      * @param [in] The buffer delete state
272      */
SetDeletePending(uint8_t deletePending)273     void SetDeletePending(uint8_t deletePending)
274     {
275         bufferData_.deletePending = deletePending;
276     }
277 
278     /**
279      * @brief Get buffer state. Buffer state detail : BUFFER_STATE.
280      * @returns [in] The buffer state
281      */
GetState()282     BufferState GetState() const
283     {
284         return bufferData_.state;
285     }
286 
287     /**
288      * @brief Set buffer state. Buffer state detail : BUFFER_STATE.
289      * @param [in] The buffer state
290      */
291 
SetState(BufferState newState)292     void SetState(BufferState newState)
293     {
294         bufferData_.state = newState;
295     }
296     /**
297      * @brief Set int32 extra data for buffer, like <key,value>.
298      * @param [in] key, unique uint32_t. If exited, will overlap.
299      * @param [in] value, value which storage the value;
300      * @returns if succeed, return 0; else return -1.
301      */
302     int32_t SetInt32(uint32_t key, int32_t value) override;
303 
304     /**
305      * @brief Get int32 extra data for buffer, like <key,value>.
306      * @param [in] key, unique uint32_t..
307      * @param [out] value, value which storage the value;
308      * @returns if succeed, return 0; else return -1;
309      */
310     int32_t GetInt32(uint32_t key, int32_t& value) override;
311 
312     /**
313      * @brief Set int64 extra data for buffer, like <key,value>.
314      * @param [in] key, unique uint32_t. If exited, will overlap.
315      * @param [in] value, value which storage the value;
316      * @returns if succeed, return 0; else return -1.
317      */
318     int32_t SetInt64(uint32_t key, int64_t value) override;
319 
320     /**
321      * @brief Get int64 extra data for buffer, like <key,value>.
322      * @param [in] key, unique uint32_t..
323      * @param [out] value, value which storage the value;
324      * @returns if succeed, return 0; else return -1;
325      */
326     int32_t GetInt64(uint32_t key, int64_t& value) override;
327 
328     /**
329      * @brief Verify the two surface buffer same or not.
330      * @param [in] The other SurfaceBufferImpl object
331      * @returns Is same or not.
332      */
equals(const SurfaceBufferImpl & buffer)333     bool equals(const SurfaceBufferImpl& buffer) const
334     {
335         return bufferData_ == buffer.bufferData_;
336     }
337 
338     /**
339      * @brief Get buffer attr from ipc object.
340      * @param [in] IpcIo pointer.
341      */
342     void ReadFromIpcIo(IpcIo& io);
343 
344     /**
345      * @brief Write buffer attr to ipc object.
346      * @param [in] IpcIo object.
347      */
348     void WriteToIpcIo(IpcIo& io);
349 
350     /**
351      * @brief Copy buffer extra data from input buffer to self
352      * @param [in] buffer pointer.
353      */
354     void CopyExtraData(SurfaceBufferImpl& buffer);
355 
356     /**
357      * @brief Clear buffer extra data.
358      */
359     void ClearExtraData();
360 
361 private:
362     /**
363      * Set extra data for buffer, like <key,value>.
364      * @key, unique uint32_t. If exited, will overlap;
365      * @type, value type. Current support see detail enum OHOS::BUFFER_DATA_TYPE
366      * @data, value pointer, which storage the value;
367      * @size, value length.
368      */
369     int32_t SetData(uint32_t key, uint8_t type, const void* data, uint8_t size);
370     int32_t GetData(uint32_t key, uint8_t* type, void** data, uint8_t* size);
371     struct SurfaceBufferData bufferData_;
372     std::map<uint32_t, ExtraData> extDatas_;
373     uint32_t len_;
374 };
375 } // end namespace
376 #endif
377