blob: 701340c6a8d83106105277f9370257ad6f686482 [file] [log] [blame]
Roman Stratiienko6a7ac122021-04-02 17:19:54 +03001// clang-format off
2/*
3 * Copyright (C) 2007 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#ifndef ANDROID_GRAPHIC_BUFFER_H
19#define ANDROID_GRAPHIC_BUFFER_H
20
21#include <stdint.h>
22#include <sys/types.h>
23
24#include <string>
25#include <utility>
26#include <vector>
27
28#include <android/hardware_buffer.h>
29#include <ui/ANativeObjectBase.h>
30#include <ui/GraphicBufferMapper.h>
31#include <ui/PixelFormat.h>
32#include <ui/Rect.h>
33#include <utils/Flattenable.h>
34#include <utils/RefBase.h>
35
36#include <nativebase/nativebase.h>
37
38#include <hardware/gralloc.h>
39
40namespace android {
41
42class GraphicBufferMapper;
43
44using GraphicBufferDeathCallback = std::function<void(void* /*context*/, uint64_t bufferId)>;
45
46// ===========================================================================
47// GraphicBuffer
48// ===========================================================================
49
50class GraphicBuffer
51 : public ANativeObjectBase<ANativeWindowBuffer, GraphicBuffer, RefBase>,
52 public Flattenable<GraphicBuffer>
53{
54 friend class Flattenable<GraphicBuffer>;
55public:
56
57 enum {
58 USAGE_SW_READ_NEVER = GRALLOC_USAGE_SW_READ_NEVER,
59 USAGE_SW_READ_RARELY = GRALLOC_USAGE_SW_READ_RARELY,
60 USAGE_SW_READ_OFTEN = GRALLOC_USAGE_SW_READ_OFTEN,
61 USAGE_SW_READ_MASK = GRALLOC_USAGE_SW_READ_MASK,
62
63 USAGE_SW_WRITE_NEVER = GRALLOC_USAGE_SW_WRITE_NEVER,
64 USAGE_SW_WRITE_RARELY = GRALLOC_USAGE_SW_WRITE_RARELY,
65 USAGE_SW_WRITE_OFTEN = GRALLOC_USAGE_SW_WRITE_OFTEN,
66 USAGE_SW_WRITE_MASK = GRALLOC_USAGE_SW_WRITE_MASK,
67
68 USAGE_SOFTWARE_MASK = USAGE_SW_READ_MASK|USAGE_SW_WRITE_MASK,
69
70 USAGE_PROTECTED = GRALLOC_USAGE_PROTECTED,
71
72 USAGE_HW_TEXTURE = GRALLOC_USAGE_HW_TEXTURE,
73 USAGE_HW_RENDER = GRALLOC_USAGE_HW_RENDER,
74 USAGE_HW_2D = GRALLOC_USAGE_HW_2D,
75 USAGE_HW_COMPOSER = GRALLOC_USAGE_HW_COMPOSER,
76 USAGE_HW_VIDEO_ENCODER = GRALLOC_USAGE_HW_VIDEO_ENCODER,
77 USAGE_HW_MASK = GRALLOC_USAGE_HW_MASK,
78
79 USAGE_CURSOR = GRALLOC_USAGE_CURSOR,
80 };
81
82 static sp<GraphicBuffer> from(ANativeWindowBuffer *);
83
84 static GraphicBuffer* fromAHardwareBuffer(AHardwareBuffer*);
85 static GraphicBuffer const* fromAHardwareBuffer(AHardwareBuffer const*);
86 AHardwareBuffer* toAHardwareBuffer();
87 AHardwareBuffer const* toAHardwareBuffer() const;
88
89 // Create a GraphicBuffer to be unflatten'ed into or be reallocated.
90 GraphicBuffer();
91
92 // Create a GraphicBuffer by allocating and managing a buffer internally.
93 // This function is privileged. See reallocate for details.
94 GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
95 uint32_t inLayerCount, uint64_t inUsage,
96 std::string requestorName = "<Unknown>");
97
98 // Create a GraphicBuffer from an existing handle.
99 enum HandleWrapMethod : uint8_t {
100 // Wrap and use the handle directly. It assumes the handle has been
101 // registered and never fails. The handle must have a longer lifetime
102 // than this wrapping GraphicBuffer.
103 //
104 // This can be used when, for example, you want to wrap a handle that
105 // is already managed by another GraphicBuffer.
106 WRAP_HANDLE,
107
108 // Take ownership of the handle and use it directly. It assumes the
109 // handle has been registered and never fails.
110 //
111 // This can be used to manage an already registered handle with
112 // GraphicBuffer.
113 TAKE_HANDLE,
114
115 // Take onwership of an unregistered handle and use it directly. It
116 // can fail when the buffer does not register. There is no ownership
117 // transfer on failures.
118 //
119 // This can be used to, for example, create a GraphicBuffer from a
120 // handle returned by Parcel::readNativeHandle.
121 TAKE_UNREGISTERED_HANDLE,
122
123 // Make a clone of the handle and use the cloned handle. It can fail
124 // when cloning fails or when the buffer does not register. There is
125 // never ownership transfer.
126 //
127 // This can be used to create a GraphicBuffer from a handle that
128 // cannot be used directly, such as one from hidl_handle.
129 CLONE_HANDLE,
130 };
131 GraphicBuffer(const native_handle_t* inHandle, HandleWrapMethod method, uint32_t inWidth,
132 uint32_t inHeight, PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage,
133 uint32_t inStride);
134
135 // These functions are deprecated because they only take 32 bits of usage
136 GraphicBuffer(const native_handle_t* inHandle, HandleWrapMethod method, uint32_t inWidth,
137 uint32_t inHeight, PixelFormat inFormat, uint32_t inLayerCount, uint32_t inUsage,
138 uint32_t inStride)
139 : GraphicBuffer(inHandle, method, inWidth, inHeight, inFormat, inLayerCount,
140 static_cast<uint64_t>(inUsage), inStride) {}
141 GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
142 uint32_t inLayerCount, uint32_t inUsage, uint32_t inStride,
143 native_handle_t* inHandle, bool keepOwnership);
144 GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
145 uint32_t inUsage, std::string requestorName = "<Unknown>");
146
147 // return status
148 status_t initCheck() const;
149
150 uint32_t getWidth() const { return static_cast<uint32_t>(width); }
151 uint32_t getHeight() const { return static_cast<uint32_t>(height); }
152 uint32_t getStride() const { return static_cast<uint32_t>(stride); }
153 uint64_t getUsage() const { return usage; }
154 PixelFormat getPixelFormat() const { return format; }
155 uint32_t getLayerCount() const { return static_cast<uint32_t>(layerCount); }
156 Rect getBounds() const { return Rect(width, height); }
157 uint64_t getId() const { return mId; }
158
159 uint32_t getGenerationNumber() const { return mGenerationNumber; }
160 void setGenerationNumber(uint32_t generation) {
161 mGenerationNumber = generation;
162 }
163
164 // This function is privileged. It requires access to the allocator
165 // device or service, which usually involves adding suitable selinux
166 // rules.
167 status_t reallocate(uint32_t inWidth, uint32_t inHeight,
168 PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage);
169
170 bool needsReallocation(uint32_t inWidth, uint32_t inHeight,
171 PixelFormat inFormat, uint32_t inLayerCount, uint64_t inUsage);
172
173 // For the following two lock functions, if bytesPerStride or bytesPerPixel
174 // are unknown or variable, -1 will be returned
175 status_t lock(uint32_t inUsage, void** vaddr, int32_t* outBytesPerPixel = nullptr,
176 int32_t* outBytesPerStride = nullptr);
177 status_t lock(uint32_t inUsage, const Rect& rect, void** vaddr,
178 int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr);
179 // For HAL_PIXEL_FORMAT_YCbCr_420_888
180 status_t lockYCbCr(uint32_t inUsage, android_ycbcr *ycbcr);
181 status_t lockYCbCr(uint32_t inUsage, const Rect& rect,
182 android_ycbcr *ycbcr);
183 status_t unlock();
184 // For the following three lockAsync functions, if bytesPerStride or bytesPerPixel
185 // are unknown or variable, -1 will be returned
186 status_t lockAsync(uint32_t inUsage, void** vaddr, int fenceFd,
187 int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr);
188 status_t lockAsync(uint32_t inUsage, const Rect& rect, void** vaddr, int fenceFd,
189 int32_t* outBytesPerPixel = nullptr, int32_t* outBytesPerStride = nullptr);
190 status_t lockAsync(uint64_t inProducerUsage, uint64_t inConsumerUsage, const Rect& rect,
191 void** vaddr, int fenceFd, int32_t* outBytesPerPixel = nullptr,
192 int32_t* outBytesPerStride = nullptr);
193 status_t lockAsyncYCbCr(uint32_t inUsage, android_ycbcr *ycbcr,
194 int fenceFd);
195 status_t lockAsyncYCbCr(uint32_t inUsage, const Rect& rect,
196 android_ycbcr *ycbcr, int fenceFd);
197 status_t unlockAsync(int *fenceFd);
198
199 status_t isSupported(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
200 uint32_t inLayerCount, uint64_t inUsage, bool* outSupported) const;
201
202 ANativeWindowBuffer* getNativeBuffer() const;
203
204 // for debugging
205 static void dumpAllocationsToSystemLog();
206
207 // Flattenable protocol
208 size_t getFlattenedSize() const;
209 size_t getFdCount() const;
210 status_t flatten(void*& buffer, size_t& size, int*& fds, size_t& count) const;
211 status_t unflatten(void const*& buffer, size_t& size, int const*& fds, size_t& count);
212
213 GraphicBufferMapper::Version getBufferMapperVersion() const {
214 return mBufferMapper.getMapperVersion();
215 }
216
217 void addDeathCallback(GraphicBufferDeathCallback deathCallback, void* context);
218
219private:
220 ~GraphicBuffer();
221
222 enum {
223 ownNone = 0,
224 ownHandle = 1,
225 ownData = 2,
226 };
227
228 inline const GraphicBufferMapper& getBufferMapper() const {
229 return mBufferMapper;
230 }
231 inline GraphicBufferMapper& getBufferMapper() {
232 return mBufferMapper;
233 }
234 uint8_t mOwner;
235
236private:
237 friend class Surface;
238 friend class BpSurface;
239 friend class BnSurface;
240 friend class LightRefBase<GraphicBuffer>;
241 GraphicBuffer(const GraphicBuffer& rhs);
242 GraphicBuffer& operator = (const GraphicBuffer& rhs);
243 const GraphicBuffer& operator = (const GraphicBuffer& rhs) const;
244
245 status_t initWithSize(uint32_t inWidth, uint32_t inHeight,
246 PixelFormat inFormat, uint32_t inLayerCount,
247 uint64_t inUsage, std::string requestorName);
248
249 status_t initWithHandle(const native_handle_t* inHandle, HandleWrapMethod method,
250 uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
251 uint32_t inLayerCount, uint64_t inUsage, uint32_t inStride);
252
253 void free_handle();
254
255 GraphicBufferMapper& mBufferMapper;
256 ssize_t mInitCheck;
257
258 // numbers of fds/ints in native_handle_t to flatten
259 uint32_t mTransportNumFds;
260 uint32_t mTransportNumInts;
261
262 uint64_t mId;
263
264 // Stores the generation number of this buffer. If this number does not
265 // match the BufferQueue's internal generation number (set through
266 // IGBP::setGenerationNumber), attempts to attach the buffer will fail.
267 uint32_t mGenerationNumber;
268
269 // Send a callback when a GraphicBuffer dies.
270 //
271 // This is used for BufferStateLayer caching. GraphicBuffers are refcounted per process. When
272 // A GraphicBuffer doesn't have any more sp<> in a process, it is destroyed. This causes
273 // problems when trying to implicitcly cache across process boundaries. Ideally, both sides
274 // of the cache would hold onto wp<> references. When an app dropped its sp<>, the GraphicBuffer
275 // would be destroyed. Unfortunately, when SurfaceFlinger has only a wp<> reference to the
276 // GraphicBuffer, it immediately goes out of scope in the SurfaceFlinger process. SurfaceFlinger
277 // must hold onto a sp<> to the buffer. When the GraphicBuffer goes out of scope in the app's
278 // process, the client side cache will get this callback. It erases the buffer from its cache
279 // and informs SurfaceFlinger that it should drop its strong pointer reference to the buffer.
280 std::vector<std::pair<GraphicBufferDeathCallback, void* /*mDeathCallbackContext*/>>
281 mDeathCallbacks;
282};
283
284}; // namespace android
285
286#endif // ANDROID_GRAPHIC_BUFFER_H