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