void BufferManager::CreateSharedHandle(buffer_handle_t inbuffer, const BufferDescriptor &descriptor, buffer_handle_t *outbuffer) { // TODO(user): This path is not verified private_handle_t const *input = reinterpret_cast<private_handle_t const *>(inbuffer); // Get Buffer attributes or dimension unsigned int alignedw = 0, alignedh = 0; allocator_->GetAlignedWidthAndHeight(descriptor, &alignedw, &alignedh); // create new handle from input reference handle and given descriptor int flags = GetHandleFlags(descriptor.GetFormat(), descriptor.GetProducerUsage(), descriptor.GetConsumerUsage()); int buffer_type = GetBufferType(descriptor.GetFormat()); // Duplicate the fds // TODO(user): Not sure what to do for fb_id. Use duped fd and new dimensions? private_handle_t *out_hnd = new private_handle_t(dup(input->fd), dup(input->fd_metadata), flags, INT(alignedw), INT(alignedh), descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(), buffer_type, input->size, descriptor.GetProducerUsage(), descriptor.GetConsumerUsage()); out_hnd->id = ++next_id_; // TODO(user): Base address of shared handle and ion handles RegisterHandleLocked(out_hnd, -1, -1); *outbuffer = out_hnd; }
int BufferManager::AllocateBuffer(const BufferDescriptor &descriptor, buffer_handle_t *handle, unsigned int bufferSize) { if (!handle) return -EINVAL; int format = descriptor.GetFormat(); gralloc1_producer_usage_t prod_usage = descriptor.GetProducerUsage(); gralloc1_consumer_usage_t cons_usage = descriptor.GetConsumerUsage(); uint32_t layer_count = descriptor.GetLayerCount(); // Get implementation defined format int gralloc_format = allocator_->GetImplDefinedFormat(prod_usage, cons_usage, format); unsigned int size; unsigned int alignedw, alignedh; int buffer_type = GetBufferType(gralloc_format); allocator_->GetBufferSizeAndDimensions(descriptor, &size, &alignedw, &alignedh); size = (bufferSize >= size) ? bufferSize : size; int err = 0; int flags = 0; auto page_size = UINT(getpagesize()); AllocData data; data.align = GetDataAlignment(format, prod_usage, cons_usage); size = ALIGN(size, data.align) * layer_count; data.size = size; data.handle = (uintptr_t) handle; data.uncached = allocator_->UseUncached(prod_usage, cons_usage); // Allocate buffer memory err = allocator_->AllocateMem(&data, prod_usage, cons_usage); if (err) { ALOGE("gralloc failed to allocate err=%s", strerror(-err)); return err; } // Allocate memory for MetaData AllocData e_data; e_data.size = ALIGN(UINT(sizeof(MetaData_t)), page_size); e_data.handle = data.handle; e_data.align = page_size; err = allocator_->AllocateMem(&e_data, GRALLOC1_PRODUCER_USAGE_NONE, GRALLOC1_CONSUMER_USAGE_NONE); if (err) { ALOGE("gralloc failed to allocate metadata error=%s", strerror(-err)); return err; } flags = GetHandleFlags(format, prod_usage, cons_usage); flags |= data.alloc_type; // Create handle private_handle_t *hnd = new private_handle_t(data.fd, e_data.fd, flags, INT(alignedw), INT(alignedh), descriptor.GetWidth(), descriptor.GetHeight(), format, buffer_type, size, prod_usage, cons_usage); hnd->id = ++next_id_; hnd->base = 0; hnd->base_metadata = 0; hnd->layer_count = layer_count; ColorSpace_t colorSpace = ITU_R_601; setMetaData(hnd, UPDATE_COLOR_SPACE, reinterpret_cast<void *>(&colorSpace)); *handle = hnd; RegisterHandleLocked(hnd, data.ion_handle, e_data.ion_handle); ALOGD_IF(DEBUG, "Allocated buffer handle: %p id: %" PRIu64, hnd, hnd->id); if (DEBUG) { private_handle_t::Dump(hnd); } return err; }