• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) Imagination Technologies Ltd.
2  *
3  * The contents of this file are subject to the MIT license as set out below.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to deal
7  * in the Software without restriction, including without limitation the rights
8  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9  * copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21  * THE SOFTWARE.
22  */
23 
24 #ifndef IMG_GRALLOC1_H
25 #define IMG_GRALLOC1_H
26 
27 #include <hardware/gralloc1.h>
28 
29 #include <stdlib.h>
30 
31 #define GRALLOC1_FUNCTION_IMG_EXT_OFF 1000
32 
33 enum
34 {
35 	GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG =
36 		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_BLIT_HANDLE_TO_HANDLE_IMG),
37 	GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG =
38 		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_BUFFER_CPU_ADDRESSES_IMG),
39 	GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG =
40 		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_PUT_BUFFER_CPU_ADDRESSES_IMG),
41 	GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG =
42 		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_DEVICE_IMG),
43 	GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG =
44 		(GRALLOC1_FUNCTION_IMG_EXT_OFF + GRALLOC_GET_DISPLAY_STATUS_IMG),
45 };
46 
gralloc1_register_img(gralloc1_device_t * g,buffer_handle_t handle)47 static inline int gralloc1_register_img
48 	(gralloc1_device_t *g, buffer_handle_t handle)
49 {
50 	GRALLOC1_PFN_RETAIN f =
51 		(GRALLOC1_PFN_RETAIN)
52 			g->getFunction(g, GRALLOC1_FUNCTION_RETAIN);
53 	int32_t err;
54 
55 	err = f(g, handle);
56 	switch (err)
57 	{
58 		case GRALLOC1_ERROR_NO_RESOURCES:
59 			return -EAGAIN;
60 		case GRALLOC1_ERROR_NONE:
61 			return 0;
62 		default:
63 			return -EINVAL;
64 	}
65 }
66 
gralloc1_unregister_img(gralloc1_device_t * g,buffer_handle_t handle)67 static inline int gralloc1_unregister_img
68 	(gralloc1_device_t *g, buffer_handle_t handle)
69 {
70 	GRALLOC1_PFN_RELEASE f =
71 		(GRALLOC1_PFN_RELEASE)
72 			g->getFunction(g, GRALLOC1_FUNCTION_RELEASE);
73 	int32_t err;
74 
75 	err = f(g, handle);
76 	switch (err)
77 	{
78 		case GRALLOC1_ERROR_NONE:
79 			return 0;
80 		default:
81 			return -EINVAL;
82 	}
83 }
84 
gralloc1_device_alloc_img(gralloc1_device_t * d,int w,int h,int format,int usage,buffer_handle_t * handle,int * stride)85 static inline int gralloc1_device_alloc_img
86 	(gralloc1_device_t *d, int w, int h, int format, int usage,
87 	 buffer_handle_t *handle, int *stride)
88 {
89 	GRALLOC1_PFN_ALLOCATE allocate =
90 		(GRALLOC1_PFN_ALLOCATE)
91 			d->getFunction(d, GRALLOC1_FUNCTION_ALLOCATE);
92 	GRALLOC1_PFN_CREATE_DESCRIPTOR createDescriptor =
93 		(GRALLOC1_PFN_CREATE_DESCRIPTOR)
94 			d->getFunction(d, GRALLOC1_FUNCTION_CREATE_DESCRIPTOR);
95 	GRALLOC1_PFN_DESTROY_DESCRIPTOR destroyDescriptor =
96 		(GRALLOC1_PFN_DESTROY_DESCRIPTOR)
97 			d->getFunction(d, GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR);
98 	GRALLOC1_PFN_SET_CONSUMER_USAGE setConsumerUsage =
99 		(GRALLOC1_PFN_SET_CONSUMER_USAGE)
100 			d->getFunction(d, GRALLOC1_FUNCTION_SET_CONSUMER_USAGE);
101 	GRALLOC1_PFN_SET_DIMENSIONS setDimensions =
102 		(GRALLOC1_PFN_SET_DIMENSIONS)
103 			d->getFunction(d, GRALLOC1_FUNCTION_SET_DIMENSIONS);
104 	GRALLOC1_PFN_SET_FORMAT setFormat =
105 		(GRALLOC1_PFN_SET_FORMAT)
106 			d->getFunction(d, GRALLOC1_FUNCTION_SET_FORMAT);
107 	GRALLOC1_PFN_SET_PRODUCER_USAGE setProducerUsage =
108 		(GRALLOC1_PFN_SET_PRODUCER_USAGE)
109 			d->getFunction(d, GRALLOC1_FUNCTION_SET_PRODUCER_USAGE);
110 	GRALLOC1_PFN_GET_STRIDE getStride =
111 		(GRALLOC1_PFN_GET_STRIDE)
112 			d->getFunction(d, GRALLOC1_FUNCTION_GET_STRIDE);
113 	uint64_t producerUsage =
114 		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN    |
115 		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN   |
116 		          GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET |
117 		          GRALLOC1_PRODUCER_USAGE_PROTECTED         |
118 		          GRALLOC1_PRODUCER_USAGE_CAMERA            |
119 		          GRALLOC1_PRODUCER_USAGE_VIDEO_DECODER));
120 	uint64_t consumerUsage =
121 		(usage & (GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN    |
122 		          GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE       |
123 		          GRALLOC1_CONSUMER_USAGE_HWCOMPOSER        |
124 		          GRALLOC1_CONSUMER_USAGE_CLIENT_TARGET     |
125 		          GRALLOC1_CONSUMER_USAGE_CURSOR            |
126 		          GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER     |
127 		          GRALLOC1_CONSUMER_USAGE_CAMERA            |
128 		          GRALLOC1_CONSUMER_USAGE_RENDERSCRIPT));
129 	gralloc1_buffer_descriptor_t descriptor;
130 	uint32_t stride32;
131 	int err = -EINVAL;
132 	int32_t err32;
133 
134 	err32 = createDescriptor(d, &descriptor);
135 	if (err32 != GRALLOC1_ERROR_NONE)
136 		goto err_out;
137 
138 	err32 = setDimensions(d, descriptor, w, h);
139 	if (err32 != GRALLOC1_ERROR_NONE)
140 		goto err_destroy_descriptor;
141 
142 	err32 = setFormat(d, descriptor, format);
143 	if (err32 != GRALLOC1_ERROR_NONE)
144 		goto err_destroy_descriptor;
145 
146 	err32 = setConsumerUsage(d, descriptor, consumerUsage);
147 	if (err32 != GRALLOC1_ERROR_NONE)
148 		goto err_destroy_descriptor;
149 
150 	err32 = setProducerUsage(d, descriptor, producerUsage);
151 	if (err32 != GRALLOC1_ERROR_NONE)
152 		goto err_destroy_descriptor;
153 
154 	err32 = allocate(d, 1, &descriptor, handle);
155 	switch (err32)
156 	{
157 		case GRALLOC1_ERROR_NOT_SHARED:
158 		case GRALLOC1_ERROR_NONE:
159 			break;
160 		case GRALLOC1_ERROR_NO_RESOURCES:
161 			err = -EAGAIN;
162 		default:
163 			goto err_destroy_descriptor;
164 	}
165 
166 	err32 = getStride(d, *handle, &stride32);
167 	if (err32 != GRALLOC1_ERROR_NONE)
168 	{
169 		gralloc1_unregister_img(d, *handle);
170 		goto err_destroy_descriptor;
171 	}
172 
173 	*stride = (int)stride32;
174 	err = 0;
175 err_destroy_descriptor:
176 	destroyDescriptor(d, descriptor);
177 err_out:
178 	return err;
179 }
180 
gralloc1_device_free_img(gralloc1_device_t * d,buffer_handle_t handle)181 static inline int gralloc1_device_free_img
182 	(gralloc1_device_t *d, buffer_handle_t handle)
183 {
184 	return gralloc1_unregister_img(d, handle);
185 }
186 
gralloc1_lock_async_img(gralloc1_device_t * g,buffer_handle_t handle,int usage,const gralloc1_rect_t * r,void ** vaddr,int acquireFence)187 static inline int gralloc1_lock_async_img
188 	(gralloc1_device_t *g, buffer_handle_t handle, int usage,
189 	 const gralloc1_rect_t *r, void **vaddr, int acquireFence)
190 {
191 	GRALLOC1_PFN_LOCK f =
192 		(GRALLOC1_PFN_LOCK)
193 			g->getFunction(g, GRALLOC1_FUNCTION_LOCK);
194 	uint64_t producerUsage =
195 		(usage & (GRALLOC1_PRODUCER_USAGE_CPU_READ_OFTEN |
196 		          GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN));
197 	uint64_t consumerUsage =
198 		(usage &  GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN);
199 	int32_t err;
200 
201 	err = f(g, handle, producerUsage, consumerUsage, r, vaddr, acquireFence);
202 	switch (err)
203 	{
204 		case GRALLOC1_ERROR_NONE:
205 			return 0;
206 		case GRALLOC1_ERROR_NO_RESOURCES:
207 			return -EAGAIN;
208 		default:
209 			return -EINVAL;
210 	}
211 }
212 
gralloc1_unlock_async_img(gralloc1_device_t * g,buffer_handle_t handle,int * releaseFence)213 static inline int gralloc1_unlock_async_img
214 	(gralloc1_device_t *g, buffer_handle_t handle, int *releaseFence)
215 {
216 	GRALLOC1_PFN_UNLOCK f =
217 		(GRALLOC1_PFN_UNLOCK)
218 			g->getFunction(g, GRALLOC1_FUNCTION_UNLOCK);
219 	int32_t err, releaseFence32;
220 
221 	err = f(g, handle, &releaseFence32);
222 	switch (err)
223 	{
224 		case GRALLOC1_ERROR_NONE:
225 			*releaseFence = releaseFence32;
226 			return 0;
227 		default:
228 			return -EINVAL;
229 	}
230 }
231 
232 typedef int (*GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
233 	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
234 	 int w, int h, int x, int y, int transform, int input_fence,
235 	 int *output_fence);
236 
gralloc1_blit_handle_to_handle_img(gralloc1_device_t * g,buffer_handle_t src,buffer_handle_t dest,int w,int h,int x,int y,int transform,int input_fence,int * output_fence)237 static inline int gralloc1_blit_handle_to_handle_img
238 	(gralloc1_device_t *g, buffer_handle_t src, buffer_handle_t dest,
239 	 int w, int h, int x, int y, int transform, int input_fence,
240 	 int *output_fence)
241 {
242 	GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG f =
243 		(GRALLOC1_PFN_BLIT_HANDLE_TO_HANDLE_IMG)
244 			g->getFunction(g, GRALLOC1_FUNCTION_BLIT_HANDLE_TO_HANDLE_IMG);
245 
246 	return f(g, src, dest, w, h, x, y, transform, input_fence, output_fence);
247 }
248 
249 typedef int (*GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
250 	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
251 	 size_t *sizes);
252 
gralloc1_get_buffer_cpu_addresses_img(gralloc1_device_t * g,buffer_handle_t handle,void ** vaddrs,size_t * sizes)253 static inline int gralloc1_get_buffer_cpu_addresses_img
254 	(gralloc1_device_t *g, buffer_handle_t handle, void **vaddrs,
255 	 size_t *sizes)
256 {
257 	GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG f =
258 		(GRALLOC1_PFN_GET_BUFFER_CPU_ADDRESSES_IMG)
259 			g->getFunction(g, GRALLOC1_FUNCTION_GET_BUFFER_CPU_ADDRESSES_IMG);
260 
261 	return f(g, handle, vaddrs, sizes);
262 }
263 
264 typedef int (*GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
265 	(gralloc1_device_t *g, buffer_handle_t handle);
266 
gralloc1_put_buffer_cpu_addresses_img(gralloc1_device_t * g,buffer_handle_t handle)267 static inline int gralloc1_put_buffer_cpu_addresses_img
268 	(gralloc1_device_t *g, buffer_handle_t handle)
269 {
270 	GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG f =
271 		(GRALLOC1_PFN_PUT_BUFFER_CPU_ADDRESSES_IMG)
272 			g->getFunction(g, GRALLOC1_FUNCTION_PUT_BUFFER_CPU_ADDRESSES_IMG);
273 
274 	return f(g, handle);
275 }
276 
277 typedef int (*GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
278 	(gralloc1_device_t *g, void **ppvDispDev);
279 
gralloc1_get_display_device_img(gralloc1_device_t * g,void ** ppvDispDev)280 static inline int gralloc1_get_display_device_img
281 	(gralloc1_device_t *g, void **ppvDispDev)
282 {
283 	GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG f =
284 		(GRALLOC1_PFN_GET_DISPLAY_DEVICE_IMG)
285 			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_DEVICE_IMG);
286 
287 	return f(g, ppvDispDev);
288 }
289 
290 typedef int (*GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
291 	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status);
292 
gralloc1_get_display_status_img(gralloc1_device_t * g,buffer_handle_t handle,uint32_t * pui32Status)293 static inline int gralloc1_get_display_status_img
294 	(gralloc1_device_t *g, buffer_handle_t handle, uint32_t *pui32Status)
295 {
296 	GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG f =
297 		(GRALLOC1_PFN_GET_DISPLAY_STATUS_IMG)
298 			g->getFunction(g, GRALLOC1_FUNCTION_GET_DISPLAY_STATUS_IMG);
299 
300 	return f(g, handle, pui32Status);
301 }
302 
303 #endif /* IMG_GRALLOC1_H */
304