status_t Gralloc4Allocator::allocate(std::string requestorName, uint32_t width, uint32_t height,
                                     android::PixelFormat format, uint32_t layerCount,
                                     uint64_t usage, uint32_t bufferCount, uint32_t* outStride,
                                     buffer_handle_t* outBufferHandles, bool importBuffers) const {
    IMapper::BufferDescriptorInfo descriptorInfo;
    sBufferDescriptorInfo(requestorName, width, height, format, layerCount, usage, &descriptorInfo);

    BufferDescriptor descriptor;
    status_t error = mMapper.createDescriptor(static_cast<void*>(&descriptorInfo),
                                              static_cast<void*>(&descriptor));
    if (error != NO_ERROR) {
        return error;
    }

sBufferDescriptorInfo() 是静态内联函数,它把 requestorNamewidthheight 等等赋值给了 descriptorInfo

调用 IMapper::createDescriptor() 创建 BufferDescriptor,它的类型是 vec<uint8_t>,定义在 hardware/interfaces/graphics/mapper/4.0/types.hal

    auto ret = mAllocator->allocate(descriptor, bufferCount,
            [&](const auto& tmpError, const auto& tmpStride,
                const auto& tmpBuffers) {
                error = static_cast<status_t>(tmpError);
                if (tmpError != Error::NONE) {
                    return;
                }

                if (importBuffers) {
                    for (uint32_t i = 0; i < bufferCount; i++) {
                        error = mMapper.importBuffer(tmpBuffers[i],
                                                     &outBufferHandles[i]);
                        if (error != NO_ERROR) {
                            for (uint32_t j = 0; j < i; j++) {
                                mMapper.freeBuffer(outBufferHandles[j]);
                                outBufferHandles[j] = nullptr;
                            }
                            return;
                        }
                    }
                } else {
                    for (uint32_t i = 0; i < bufferCount; i++) {
                        outBufferHandles[i] = native_handle_clone(
                                tmpBuffers[i].getNativeHandle());
                        if (!outBufferHandles[i]) {
                            for (uint32_t j = 0; j < i; j++) {
                                auto buffer = const_cast<native_handle_t*>(
                                        outBufferHandles[j]);
                                native_handle_close(buffer);
                                native_handle_delete(buffer);
                                outBufferHandles[j] = nullptr;
                            }
                        }
                    }
                }
                *outStride = tmpStride;
            });

    // make sure the kernel driver sees BC_FREE_BUFFER and closes the fds now
    hardware::IPCThreadState::self()->flushCommands();

    return (ret.isOk()) ? error : static_cast<status_t>(kTransactionError);
}

调用 IAllocator::allocate() 分配 buffer,传入 BufferDescriptor 和 buffer 数量。

IAllocator 和 IMapper 都是 HAL 接口,它们由硬件厂商实现,所以 BufferDescriptor 是硬件厂商定义的一种格式。

如果 importBufferstrue,则调用 Gralloc4Mapper::importBuffer() 获取 buffer_handle_t,否则调用 native_handle_clone() 拷贝 native_handle 指针。