• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
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 
40 int gralloc_device_open(const struct hw_module_t *module, const char *name, hw_device_t **device);
41 
42 int gralloc_device_close(struct hw_device_t *device);
43 
44 static struct hw_module_methods_t gralloc_module_methods = {.open = gralloc_device_open};
45 
46 struct hw_module_t gralloc_module = {};
47 
48 struct 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 
gralloc_device_open(const struct hw_module_t * module,const char * name,hw_device_t ** device)62 int 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 
80 namespace gralloc1 {
81 
GrallocImpl(const private_module_t * module)82 GrallocImpl::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 
Init()91 bool GrallocImpl::Init() {
92   buf_mgr_ = new BufferManager();
93 
94   return buf_mgr_->Init();
95 }
96 
~GrallocImpl()97 GrallocImpl::~GrallocImpl() {
98   if (buf_mgr_) {
99     delete buf_mgr_;
100   }
101 }
102 
CloseDevice(hw_device_t * device)103 int GrallocImpl::CloseDevice(hw_device_t *device) {
104   GrallocImpl *impl = reinterpret_cast<GrallocImpl *>(device);
105   delete impl;
106 
107   return 0;
108 }
109 
GetCapabilities(struct gralloc1_device * device,uint32_t * out_count,int32_t * out_capabilities)110 void 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 
GetFunction(gralloc1_device_t * device,int32_t function)124 gralloc1_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 
CheckDeviceAndDescriptor(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor)183 gralloc1_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 
CheckDeviceAndHandle(gralloc1_device_t * device,buffer_handle_t buffer)193 gralloc1_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 
CreateBufferDescriptor(gralloc1_device_t * device,gralloc1_buffer_descriptor_t * out_descriptor)204 gralloc1_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 
DestroyBufferDescriptor(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor)220 gralloc1_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 
SetConsumerUsage(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor,gralloc1_consumer_usage_t usage)230 gralloc1_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 
SetBufferDimensions(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor,uint32_t width,uint32_t height)241 gralloc1_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 
SetColorFormat(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor,int32_t format)252 gralloc1_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 
SetProducerUsage(gralloc1_device_t * device,gralloc1_buffer_descriptor_t descriptor,gralloc1_producer_usage_t usage)263 gralloc1_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 
GetBackingStore(gralloc1_device_t * device,buffer_handle_t buffer,gralloc1_backing_store_t * out_backstore)274 gralloc1_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 
GetConsumerUsage(gralloc1_device_t * device,buffer_handle_t buffer,gralloc1_consumer_usage_t * outUsage)286 gralloc1_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 
GetBufferDimensions(gralloc1_device_t * device,buffer_handle_t buffer,uint32_t * outWidth,uint32_t * outHeight)296 gralloc1_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 
GetColorFormat(gralloc1_device_t * device,buffer_handle_t buffer,int32_t * outFormat)308 gralloc1_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 
GetProducerUsage(gralloc1_device_t * device,buffer_handle_t buffer,gralloc1_producer_usage_t * outUsage)318 gralloc1_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 
GetBufferStride(gralloc1_device_t * device,buffer_handle_t buffer,uint32_t * outStride)329 gralloc1_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 
AllocateBuffers(gralloc1_device_t * device,uint32_t num_dptors,const gralloc1_buffer_descriptor_t * dptors,buffer_handle_t * outBuffers)339 gralloc1_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 
RetainBuffer(gralloc1_device_t * device,buffer_handle_t buffer)353 gralloc1_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 
ReleaseBuffer(gralloc1_device_t * device,buffer_handle_t buffer)364 gralloc1_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 
LockBuffer(gralloc1_device_t * device,buffer_handle_t buffer,gralloc1_producer_usage_t prod_usage,gralloc1_consumer_usage_t cons_usage,const gralloc1_rect_t * region,void ** out_data,int32_t acquire_fence)375 gralloc1_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.
412 gralloc1_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 
UnlockBuffer(gralloc1_device_t * device,buffer_handle_t buffer,int32_t * release_fence)432 gralloc1_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 
Gralloc1Perform(gralloc1_device_t * device,int operation,...)448 gralloc1_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
459