• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /**
18  * @file hardware_buffer.h
19  */
20 
21 #ifndef ANDROID_HARDWARE_BUFFER_H
22 #define ANDROID_HARDWARE_BUFFER_H
23 
24 #include <inttypes.h>
25 
26 #include <sys/cdefs.h>
27 
28 #include <android/rect.h>
29 
30 __BEGIN_DECLS
31 
32 /**
33  * Buffer pixel formats.
34  */
35 enum {
36     /**
37      * Corresponding formats:
38      *   Vulkan: VK_FORMAT_R8G8B8A8_UNORM
39      *   OpenGL ES: GL_RGBA8
40      */
41     AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM           = 1,
42 
43     /**
44      * Corresponding formats:
45      *   Vulkan: VK_FORMAT_R8G8B8A8_UNORM
46      *   OpenGL ES: GL_RGBA8
47      */
48     AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM           = 2,
49 
50     /**
51      * Corresponding formats:
52      *   Vulkan: VK_FORMAT_R8G8B8_UNORM
53      *   OpenGL ES: GL_RGB8
54      */
55     AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM             = 3,
56 
57     /**
58      * Corresponding formats:
59      *   Vulkan: VK_FORMAT_R5G6B5_UNORM_PACK16
60      *   OpenGL ES: GL_RGB565
61      */
62     AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM             = 4,
63 
64     /**
65      * Corresponding formats:
66      *   Vulkan: VK_FORMAT_R16G16B16A16_SFLOAT
67      *   OpenGL ES: GL_RGBA16F
68      */
69     AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT       = 0x16,
70 
71     /**
72      * Corresponding formats:
73      *   Vulkan: VK_FORMAT_A2B10G10R10_UNORM_PACK32
74      *   OpenGL ES: GL_RGB10_A2
75      */
76     AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM        = 0x2b,
77 
78     /**
79      * An opaque binary blob format that must have height 1, with width equal to
80      * the buffer size in bytes.
81      */
82     AHARDWAREBUFFER_FORMAT_BLOB                     = 0x21,
83 };
84 
85 enum {
86     /* The buffer will never be read by the CPU */
87     AHARDWAREBUFFER_USAGE_CPU_READ_NEVER        = 0UL,
88     /* The buffer will sometimes be read by the CPU */
89     AHARDWAREBUFFER_USAGE_CPU_READ_RARELY       = 2UL,
90     /* The buffer will often be read by the CPU */
91     AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN        = 3UL,
92     /* CPU read value mask */
93     AHARDWAREBUFFER_USAGE_CPU_READ_MASK         = 0xFUL,
94 
95     /* The buffer will never be written by the CPU */
96     AHARDWAREBUFFER_USAGE_CPU_WRITE_NEVER       = 0UL << 4,
97     /* The buffer will sometimes be written to by the CPU */
98     AHARDWAREBUFFER_USAGE_CPU_WRITE_RARELY      = 2UL << 4,
99     /* The buffer will often be written to by the CPU */
100     AHARDWAREBUFFER_USAGE_CPU_WRITE_OFTEN       = 3UL << 4,
101     /* CPU write value mask */
102     AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK        = 0xFUL << 4,
103 
104     /* The buffer will be read from by the GPU */
105     AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE      = 1UL << 8,
106     /* The buffer will be written to by the GPU */
107     AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT       = 1UL << 9,
108     /* The buffer must not be used outside of a protected hardware path */
109     AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT      = 1UL << 14,
110     /* The buffer will be read by a hardware video encoder */
111     AHARDWAREBUFFER_USAGE_VIDEO_ENCODE           = 1UL << 16,
112     /** The buffer will be used for sensor direct data */
113     AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA     = 1UL << 23,
114     /* The buffer will be used as a shader storage or uniform buffer object*/
115     AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER        = 1UL << 24,
116 
117     AHARDWAREBUFFER_USAGE_VENDOR_0  = 1ULL << 28,
118     AHARDWAREBUFFER_USAGE_VENDOR_1  = 1ULL << 29,
119     AHARDWAREBUFFER_USAGE_VENDOR_2  = 1ULL << 30,
120     AHARDWAREBUFFER_USAGE_VENDOR_3  = 1ULL << 31,
121     AHARDWAREBUFFER_USAGE_VENDOR_4  = 1ULL << 48,
122     AHARDWAREBUFFER_USAGE_VENDOR_5  = 1ULL << 49,
123     AHARDWAREBUFFER_USAGE_VENDOR_6  = 1ULL << 50,
124     AHARDWAREBUFFER_USAGE_VENDOR_7  = 1ULL << 51,
125     AHARDWAREBUFFER_USAGE_VENDOR_8  = 1ULL << 52,
126     AHARDWAREBUFFER_USAGE_VENDOR_9  = 1ULL << 53,
127     AHARDWAREBUFFER_USAGE_VENDOR_10 = 1ULL << 54,
128     AHARDWAREBUFFER_USAGE_VENDOR_11 = 1ULL << 55,
129     AHARDWAREBUFFER_USAGE_VENDOR_12 = 1ULL << 56,
130     AHARDWAREBUFFER_USAGE_VENDOR_13 = 1ULL << 57,
131     AHARDWAREBUFFER_USAGE_VENDOR_14 = 1ULL << 58,
132     AHARDWAREBUFFER_USAGE_VENDOR_15 = 1ULL << 59,
133     AHARDWAREBUFFER_USAGE_VENDOR_16 = 1ULL << 60,
134     AHARDWAREBUFFER_USAGE_VENDOR_17 = 1ULL << 61,
135     AHARDWAREBUFFER_USAGE_VENDOR_18 = 1ULL << 62,
136     AHARDWAREBUFFER_USAGE_VENDOR_19 = 1ULL << 63,
137 };
138 
139 typedef struct AHardwareBuffer_Desc {
140     uint32_t    width;      // width in pixels
141     uint32_t    height;     // height in pixels
142     uint32_t    layers;     // number of images
143     uint32_t    format;     // One of AHARDWAREBUFFER_FORMAT_*
144     uint64_t    usage;      // Combination of AHARDWAREBUFFER_USAGE_*
145     uint32_t    stride;     // Stride in pixels, ignored for AHardwareBuffer_allocate()
146     uint32_t    rfu0;       // Initialize to zero, reserved for future use
147     uint64_t    rfu1;       // Initialize to zero, reserved for future use
148 } AHardwareBuffer_Desc;
149 
150 typedef struct AHardwareBuffer AHardwareBuffer;
151 
152 /**
153  * Allocates a buffer that backs an AHardwareBuffer using the passed
154  * AHardwareBuffer_Desc.
155  *
156  * Returns NO_ERROR on success, or an error number of the allocation fails for
157  * any reason.
158  */
159 int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc,
160         AHardwareBuffer** outBuffer);
161 /**
162  * Acquire a reference on the given AHardwareBuffer object.  This prevents the
163  * object from being deleted until the last reference is removed.
164  */
165 void AHardwareBuffer_acquire(AHardwareBuffer* buffer);
166 
167 /**
168  * Remove a reference that was previously acquired with
169  * AHardwareBuffer_acquire().
170  */
171 void AHardwareBuffer_release(AHardwareBuffer* buffer);
172 
173 /**
174  * Return a description of the AHardwareBuffer in the passed
175  * AHardwareBuffer_Desc struct.
176  */
177 void AHardwareBuffer_describe(const AHardwareBuffer* buffer,
178         AHardwareBuffer_Desc* outDesc);
179 
180 /*
181  * Lock the AHardwareBuffer for reading or writing, depending on the usage flags
182  * passed.  This call may block if the hardware needs to finish rendering or if
183  * CPU caches need to be synchronized, or possibly for other implementation-
184  * specific reasons.  If fence is not negative, then it specifies a fence file
185  * descriptor that will be signaled when the buffer is locked, otherwise the
186  * caller will block until the buffer is available.
187  *
188  * If rect is not NULL, the caller promises to modify only data in the area
189  * specified by rect. If rect is NULL, the caller may modify the contents of the
190  * entire buffer.
191  *
192  * The content of the buffer outside of the specified rect is NOT modified
193  * by this call.
194  *
195  * The buffer usage may only specify AHARDWAREBUFFER_USAGE_CPU_*. If set, then
196  * outVirtualAddress is filled with the address of the buffer in virtual memory,
197  * otherwise this function will fail.
198  *
199  * THREADING CONSIDERATIONS:
200  *
201  * It is legal for several different threads to lock a buffer for read access;
202  * none of the threads are blocked.
203  *
204  * Locking a buffer simultaneously for write or read/write is undefined, but
205  * will neither terminate the process nor block the caller; AHardwareBuffer_lock
206  * may return an error or leave the buffer's content into an indeterminate
207  * state.
208  *
209  * Returns NO_ERROR on success, BAD_VALUE if the buffer is NULL or if the usage
210  * flags are not a combination of AHARDWAREBUFFER_USAGE_CPU_*, or an error
211  * number of the lock fails for any reason.
212  */
213 int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage,
214         int32_t fence, const ARect* rect, void** outVirtualAddress);
215 
216 /*
217  * Unlock the AHardwareBuffer; must be called after all changes to the buffer
218  * are completed by the caller. If fence is not NULL then it will be set to a
219  * file descriptor that is signaled when all pending work on the buffer is
220  * completed. The caller is responsible for closing the fence when it is no
221  * longer needed.
222  *
223  * Returns NO_ERROR on success, BAD_VALUE if the buffer is NULL, or an error
224  * number of the lock fails for any reason.
225  */
226 int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence);
227 
228 /*
229  * Send the AHardwareBuffer to an AF_UNIX socket.
230  *
231  * Returns NO_ERROR on success, BAD_VALUE if the buffer is NULL, or an error
232  * number of the lock fails for any reason.
233  */
234 int AHardwareBuffer_sendHandleToUnixSocket(const AHardwareBuffer* buffer, int socketFd);
235 
236 /*
237  * Receive the AHardwareBuffer from an AF_UNIX socket.
238  *
239  * Returns NO_ERROR on success, BAD_VALUE if the buffer is NULL, or an error
240  * number of the lock fails for any reason.
241  */
242 int AHardwareBuffer_recvHandleFromUnixSocket(int socketFd, AHardwareBuffer** outBuffer);
243 
244 __END_DECLS
245 
246 #endif // ANDROID_HARDWARE_BUFFER_H
247