blob: 62589413dc8647f43f14e17264fae2af396b6940 [file] [log] [blame]
Prabhanjan Kandula96e92342016-03-24 21:03:35 +05301/*
2 * Copyright (c) 2016, The Linux Foundation. All rights reserved.
3
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above
10 * copyright notice, this list of conditions and the following
11 * disclaimer in the documentation and/or other materials provided
12 * with the distribution.
13 * * Neither the name of The Linux Foundation nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include <cutils/log.h>
31#include <sync/sync.h>
32
33#include "gr_device_impl.h"
34#include "gr_buf_descriptor.h"
35#include "gralloc_priv.h"
36#include "qd_utils.h"
37#include "qdMetaData.h"
38#include "gr_utils.h"
39
40int gralloc_device_open(const struct hw_module_t *module, const char *name, hw_device_t **device);
41
42int gralloc_device_close(struct hw_device_t *device);
43
44static struct hw_module_methods_t gralloc_module_methods = {.open = gralloc_device_open};
45
46struct hw_module_t gralloc_module = {};
47
48struct private_module_t HAL_MODULE_INFO_SYM = {
49 .base = {
50 .tag = HARDWARE_MODULE_TAG,
51 .version_major = 1,
52 .version_minor = 0,
53 .id = GRALLOC_HARDWARE_MODULE_ID,
54 .name = "Graphics Memory Module",
55 .author = "Code Aurora Forum",
56 .methods = &gralloc_module_methods,
57 .dso = 0,
58 .reserved = {0},
59 },
60};
61
62int gralloc_device_open(const struct hw_module_t *module, const char *name, hw_device_t **device) {
63 int status = -EINVAL;
64 if (!strcmp(name, GRALLOC_HARDWARE_MODULE_ID)) {
65 const private_module_t *m = reinterpret_cast<const private_module_t *>(module);
66 gralloc1::GrallocImpl * /*gralloc1_device_t*/ dev = new gralloc1::GrallocImpl(m);
67 *device = reinterpret_cast<hw_device_t *>(dev);
68
69 if (dev->Init()) {
70 status = 0;
71 } else {
72 ALOGE(" Error in opening gralloc1 device");
73 return status;
74 }
75 }
76
77 return status;
78}
79
80namespace gralloc1 {
81
82GrallocImpl::GrallocImpl(const private_module_t *module) {
83 common.tag = HARDWARE_DEVICE_TAG;
84 common.version = 1; // TODO(user): cross check version
85 common.module = const_cast<hw_module_t *>(&module->base);
86 common.close = CloseDevice;
87 getFunction = GetFunction;
88 getCapabilities = GetCapabilities;
89}
90
91bool GrallocImpl::Init() {
92 buf_mgr_ = new BufferManager();
93
94 return buf_mgr_->Init();
95}
96
97GrallocImpl::~GrallocImpl() {
98 if (buf_mgr_) {
99 delete buf_mgr_;
100 }
101}
102
103int GrallocImpl::CloseDevice(hw_device_t *device) {
104 GrallocImpl *impl = reinterpret_cast<GrallocImpl *>(device);
105 delete impl;
106
107 return 0;
108}
109
110void GrallocImpl::GetCapabilities(struct gralloc1_device *device, uint32_t *out_count,
111 int32_t /*gralloc1_capability_t*/ *out_capabilities) {
112 if (!device) {
113 // Need to plan for adding more capabilities
114 if (out_capabilities == NULL) {
115 *out_count = 1;
116 } else {
117 *out_capabilities = GRALLOC1_CAPABILITY_TEST_ALLOCATE;
118 }
119 }
120
121 return;
122}
123
124gralloc1_function_pointer_t GrallocImpl::GetFunction(gralloc1_device_t *device, int32_t function) {
125 if (!device) {
126 return NULL;
127 }
128
129 switch (function) {
130 case GRALLOC1_FUNCTION_CREATE_DESCRIPTOR:
131 return reinterpret_cast<gralloc1_function_pointer_t>(CreateBufferDescriptor);
132 case GRALLOC1_FUNCTION_DESTROY_DESCRIPTOR:
133 return reinterpret_cast<gralloc1_function_pointer_t>(DestroyBufferDescriptor);
134 case GRALLOC1_FUNCTION_SET_CONSUMER_USAGE:
135 return reinterpret_cast<gralloc1_function_pointer_t>(SetConsumerUsage);
136 case GRALLOC1_FUNCTION_SET_DIMENSIONS:
137 return reinterpret_cast<gralloc1_function_pointer_t>(SetBufferDimensions);
138 case GRALLOC1_FUNCTION_SET_FORMAT:
139 return reinterpret_cast<gralloc1_function_pointer_t>(SetColorFormat);
140 case GRALLOC1_FUNCTION_SET_PRODUCER_USAGE:
141 return reinterpret_cast<gralloc1_function_pointer_t>(SetProducerUsage);
142 case GRALLOC1_FUNCTION_GET_BACKING_STORE:
143 return reinterpret_cast<gralloc1_function_pointer_t>(GetBackingStore);
144 case GRALLOC1_FUNCTION_GET_CONSUMER_USAGE:
145 return reinterpret_cast<gralloc1_function_pointer_t>(GetConsumerUsage);
146 case GRALLOC1_FUNCTION_GET_DIMENSIONS:
147 return reinterpret_cast<gralloc1_function_pointer_t>(GetBufferDimensions);
148 case GRALLOC1_FUNCTION_GET_FORMAT:
149 return reinterpret_cast<gralloc1_function_pointer_t>(GetColorFormat);
150 case GRALLOC1_FUNCTION_GET_PRODUCER_USAGE:
151 return reinterpret_cast<gralloc1_function_pointer_t>(GetProducerUsage);
152 case GRALLOC1_FUNCTION_GET_STRIDE:
153 return reinterpret_cast<gralloc1_function_pointer_t>(GetBufferStride);
154 case GRALLOC1_FUNCTION_ALLOCATE:
155 return reinterpret_cast<gralloc1_function_pointer_t>(AllocateBuffers);
156 case GRALLOC1_FUNCTION_RETAIN:
157 return reinterpret_cast<gralloc1_function_pointer_t>(RetainBuffer);
158 case GRALLOC1_FUNCTION_RELEASE:
159 return reinterpret_cast<gralloc1_function_pointer_t>(ReleaseBuffer);
160 /* TODO(user) :definition of flex plane is not known yet
161 * Need to implement after clarification from Google.
162 * case GRALLOC1_FUNCTION_GET_NUM_FLEX_PLANES:
163 return reinterpret_cast<gralloc1_function_pointer_t> (; */
164 case GRALLOC1_FUNCTION_LOCK:
165 return reinterpret_cast<gralloc1_function_pointer_t>(LockBuffer);
166 /* TODO(user) : LOCK_YCBCR changed to LOCK_FLEX but structure is not known yet.
167 * Need to implement after clarification from Google.
168 case GRALLOC1_PFN_LOCK_FLEX:
169 return reinterpret_cast<gralloc1_function_pointer_t> (LockYCbCrBuffer;
170 */
171 case GRALLOC1_FUNCTION_UNLOCK:
172 return reinterpret_cast<gralloc1_function_pointer_t>(UnlockBuffer);
173 case GRALLOC1_FUNCTION_PERFORM:
174 return reinterpret_cast<gralloc1_function_pointer_t>(Gralloc1Perform);
175 default:
176 ALOGE("%s:Gralloc Error. Client Requested for unsupported function", __FUNCTION__);
177 return NULL;
178 }
179
180 return NULL;
181}
182
183gralloc1_error_t GrallocImpl::CheckDeviceAndDescriptor(gralloc1_device_t *device,
184 gralloc1_buffer_descriptor_t descriptor) {
185 if (!device || !BUF_DESCRIPTOR(descriptor)->IsValid()) {
186 ALOGE("Gralloc Error : device=%p, descriptor=%p", (void *)device, (void *)descriptor);
187 return GRALLOC1_ERROR_BAD_DESCRIPTOR;
188 }
189
190 return GRALLOC1_ERROR_NONE;
191}
192
193gralloc1_error_t GrallocImpl::CheckDeviceAndHandle(gralloc1_device_t *device,
194 buffer_handle_t buffer) {
195 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
196 if (!device || (private_handle_t::validate(hnd) != 0)) {
197 ALOGE("Gralloc Error : device= %p, buffer-handle=%p", (void *)device, (void *)buffer);
198 return GRALLOC1_ERROR_BAD_HANDLE;
199 }
200
201 return GRALLOC1_ERROR_NONE;
202}
203
204gralloc1_error_t GrallocImpl::CreateBufferDescriptor(gralloc1_device_t *device,
205 gralloc1_buffer_descriptor_t *out_descriptor) {
206 if (!device) {
207 return GRALLOC1_ERROR_BAD_DESCRIPTOR;
208 }
209
210 BufferDescriptor *descriptor = new BufferDescriptor();
211 if (descriptor == NULL) {
212 return GRALLOC1_ERROR_NO_RESOURCES;
213 }
214
215 *out_descriptor = reinterpret_cast<gralloc1_buffer_descriptor_t>(descriptor);
216
217 return GRALLOC1_ERROR_NONE;
218}
219
220gralloc1_error_t GrallocImpl::DestroyBufferDescriptor(gralloc1_device_t *device,
221 gralloc1_buffer_descriptor_t descriptor) {
222 gralloc1_error_t status = CheckDeviceAndDescriptor(device, descriptor);
223 if (status == GRALLOC1_ERROR_NONE) {
224 delete reinterpret_cast<BufferDescriptor *>(descriptor);
225 }
226
227 return status;
228}
229
230gralloc1_error_t GrallocImpl::SetConsumerUsage(gralloc1_device_t *device,
231 gralloc1_buffer_descriptor_t descriptor,
232 gralloc1_consumer_usage_t usage) {
233 gralloc1_error_t status = CheckDeviceAndDescriptor(device, descriptor);
234 if (status == GRALLOC1_ERROR_NONE) {
235 BUF_DESCRIPTOR(descriptor)->SetConsumerUsage(usage);
236 }
237
238 return status;
239}
240
241gralloc1_error_t GrallocImpl::SetBufferDimensions(gralloc1_device_t *device,
242 gralloc1_buffer_descriptor_t descriptor,
243 uint32_t width, uint32_t height) {
244 gralloc1_error_t status = CheckDeviceAndDescriptor(device, descriptor);
245 if (status == GRALLOC1_ERROR_NONE) {
246 BUF_DESCRIPTOR(descriptor)->SetDimensions(INT(width), INT(height));
247 }
248
249 return status;
250}
251
252gralloc1_error_t GrallocImpl::SetColorFormat(gralloc1_device_t *device,
253 gralloc1_buffer_descriptor_t descriptor,
254 int32_t format) {
255 gralloc1_error_t status = CheckDeviceAndDescriptor(device, descriptor);
256 if (status == GRALLOC1_ERROR_NONE) {
257 BUF_DESCRIPTOR(descriptor)->SetColorFormat(format);
258 }
259
260 return status;
261}
262
263gralloc1_error_t GrallocImpl::SetProducerUsage(gralloc1_device_t *device,
264 gralloc1_buffer_descriptor_t descriptor,
265 gralloc1_producer_usage_t usage) {
266 gralloc1_error_t status = CheckDeviceAndDescriptor(device, descriptor);
267 if (status == GRALLOC1_ERROR_NONE) {
268 BUF_DESCRIPTOR(descriptor)->SetProducerUsage(usage);
269 }
270
271 return status;
272}
273
274gralloc1_error_t GrallocImpl::GetBackingStore(gralloc1_device_t *device, buffer_handle_t buffer,
275 gralloc1_backing_store_t *out_backstore) {
276 if (!device || !buffer) {
277 return GRALLOC1_ERROR_BAD_HANDLE;
278 }
279
280 *out_backstore =
281 static_cast<gralloc1_backing_store_t>(PRIV_HANDLE_CONST(buffer)->GetBackingstore());
282
283 return GRALLOC1_ERROR_NONE;
284}
285
286gralloc1_error_t GrallocImpl::GetConsumerUsage(gralloc1_device_t *device, buffer_handle_t buffer,
287 gralloc1_consumer_usage_t *outUsage) {
288 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
289 if (status == GRALLOC1_ERROR_NONE) {
290 *outUsage = PRIV_HANDLE_CONST(buffer)->GetConsumerUsage();
291 }
292
293 return status;
294}
295
296gralloc1_error_t GrallocImpl::GetBufferDimensions(gralloc1_device_t *device, buffer_handle_t buffer,
297 uint32_t *outWidth, uint32_t *outHeight) {
298 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
299 if (status == GRALLOC1_ERROR_NONE) {
300 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
301 *outWidth = UINT(hnd->GetRealWidth());
302 *outHeight = UINT(hnd->GetRealHeight());
303 }
304
305 return status;
306}
307
308gralloc1_error_t GrallocImpl::GetColorFormat(gralloc1_device_t *device, buffer_handle_t buffer,
309 int32_t *outFormat) {
310 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
311 if (status == GRALLOC1_ERROR_NONE) {
312 *outFormat = PRIV_HANDLE_CONST(buffer)->GetColorFormat();
313 }
314
315 return status;
316}
317
318gralloc1_error_t GrallocImpl::GetProducerUsage(gralloc1_device_t *device, buffer_handle_t buffer,
319 gralloc1_producer_usage_t *outUsage) {
320 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
321 if (status == GRALLOC1_ERROR_NONE) {
322 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
323 *outUsage = hnd->GetProducerUsage();
324 }
325
326 return status;
327}
328
329gralloc1_error_t GrallocImpl::GetBufferStride(gralloc1_device_t *device, buffer_handle_t buffer,
330 uint32_t *outStride) {
331 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
332 if (status == GRALLOC1_ERROR_NONE) {
333 *outStride = UINT(PRIV_HANDLE_CONST(buffer)->GetStride());
334 }
335
336 return status;
337}
338
339gralloc1_error_t GrallocImpl::AllocateBuffers(gralloc1_device_t *device, uint32_t num_dptors,
340 const gralloc1_buffer_descriptor_t *dptors,
341 buffer_handle_t *outBuffers) {
342 if (!num_dptors || !dptors) {
343 return GRALLOC1_ERROR_BAD_DESCRIPTOR;
344 }
345
346 GrallocImpl const *dev = GRALLOC_IMPL(device);
347 const BufferDescriptor *descriptors = reinterpret_cast<const BufferDescriptor *>(dptors);
348 gralloc1_error_t status = dev->buf_mgr_->AllocateBuffers(num_dptors, descriptors, outBuffers);
349
350 return status;
351}
352
353gralloc1_error_t GrallocImpl::RetainBuffer(gralloc1_device_t *device, buffer_handle_t buffer) {
354 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
355 if (status == GRALLOC1_ERROR_NONE) {
356 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
357 GrallocImpl const *dev = GRALLOC_IMPL(device);
358 status = dev->buf_mgr_->RetainBuffer(hnd);
359 }
360
361 return status;
362}
363
364gralloc1_error_t GrallocImpl::ReleaseBuffer(gralloc1_device_t *device, buffer_handle_t buffer) {
365 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
366 if (status == GRALLOC1_ERROR_NONE) {
367 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
368 GrallocImpl const *dev = GRALLOC_IMPL(device);
369 status = dev->buf_mgr_->ReleaseBuffer(hnd);
370 }
371
372 return status;
373}
374
375gralloc1_error_t GrallocImpl::LockBuffer(gralloc1_device_t *device, buffer_handle_t buffer,
376 gralloc1_producer_usage_t prod_usage,
377 gralloc1_consumer_usage_t cons_usage,
378 const gralloc1_rect_t *region, void **out_data,
379 int32_t acquire_fence) {
380 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
381 if (status == GRALLOC1_ERROR_NONE && (acquire_fence > 0)) {
382 int error = sync_wait(acquire_fence, 1000);
383 if (error < 0) {
384 ALOGE("%s: sync_wait timedout! error = %s", __FUNCTION__, strerror(errno));
385 return GRALLOC1_ERROR_UNDEFINED;
386 }
387 }
388
389 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
390 GrallocImpl const *dev = GRALLOC_IMPL(device);
391
392 // Either producer usage or consumer usage must be *_USAGE_NONE
393 if ((prod_usage != GRALLOC1_PRODUCER_USAGE_NONE) &&
394 (cons_usage != GRALLOC1_CONSUMER_USAGE_NONE)) {
395 return GRALLOC1_ERROR_BAD_VALUE;
396 }
397
398 // currently we ignore the region/rect client wants to lock
399 if (region == NULL) {
400 return GRALLOC1_ERROR_BAD_VALUE;
401 }
402
403 status = dev->buf_mgr_->LockBuffer(hnd, prod_usage, cons_usage);
404
405 *out_data = reinterpret_cast<void *>(hnd->base);
406
407 return status;
408}
409
410/* TODO(user) : LOCK_YCBCR changed to LOCK_FLEX but structure definition is not known yet.
411 * Need to implement after clarification from Google.
412gralloc1_error_t GrallocImpl::LockYCbCrBuffer(gralloc1_device_t* device, buffer_handle_t buffer,
413 gralloc1_producer_usage_t prod_usage, gralloc1_consumer_usage_t cons_usage,
414 const gralloc1_rect_t* region, struct android_ycbcr* outYCbCr, int32_t* outAcquireFence) {
415 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
416
417 if (status == GRALLOC1_ERROR_NONE) {
418 void **outData = 0;
419 status = LockBuffer(device, buffer, prod_usage, cons_usage, region, outData, outAcquireFence);
420 }
421
422 if (status == GRALLOC1_ERROR_NONE) {
423 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
424 GrallocImpl const *dev = GRALLOC_IMPL(device);
425 dev->allocator_->GetYUVPlaneInfo(hnd, outYCbCr);
426 }
427
428 return status;
429}
430 */
431
432gralloc1_error_t GrallocImpl::UnlockBuffer(gralloc1_device_t *device, buffer_handle_t buffer,
433 int32_t *release_fence) {
434 gralloc1_error_t status = CheckDeviceAndHandle(device, buffer);
435
436 if (status != GRALLOC1_ERROR_NONE) {
437 return status;
438 }
439
440 const private_handle_t *hnd = PRIV_HANDLE_CONST(buffer);
441 GrallocImpl const *dev = GRALLOC_IMPL(device);
442
443 *release_fence = -1;
444
445 return dev->buf_mgr_->UnlockBuffer(hnd);
446}
447
448gralloc1_error_t GrallocImpl::Gralloc1Perform(gralloc1_device_t *device, int operation, ...) {
449 va_list args;
450 va_start(args, operation);
451 GrallocImpl const *dev = GRALLOC_IMPL(device);
452 gralloc1_error_t err = dev->buf_mgr_->Perform(operation, args);
453 va_end(args);
454
455 return err;
456}
457
458} // namespace gralloc1