/*
 * Copyright (C) 2020 ARM Limited. All rights reserved.
 *
 * Copyright 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef GRALLOC_COMMON_ALLOCATOR_H
#define GRALLOC_COMMON_ALLOCATOR_H

#include "4.x/gralloc_allocator_hidl_header.h"

#include <functional>

#include "core/mali_gralloc_bufferdescriptor.h"
#include "BufferDescriptor.h"

namespace arm
{
namespace allocator
{
namespace common
{

using android::hardware::hidl_handle;
using android::hardware::hidl_vec;

/*
 * Allocates buffers with the properties specified by the descriptor
 *
 * @param bufferDescriptor: Specifies the properties of the buffers to allocate.
 * @param count: Number of buffers to allocate.
 * @param hidl_cb [in] HIDL callback function generating -
 *        error : NONE upon success. Otherwise,
 *                BAD_DESCRIPTOR when the descriptor is invalid.
 *                NO_RESOURCES when the allocation cannot be fulfilled
 *                UNSUPPORTED when any of the property encoded in the descriptor
 *                            is not supported
 *        stride: Number of pixels between two consecutive rows of the
 *                buffers, when the concept of consecutive rows is defined.
 *        buffers: An array of raw handles to the newly allocated buffers
 * @param fb_allocator [in] function to use for allocation of buffers with GRALLOC_USAGE_HW_FB
 */
void allocate(const buffer_descriptor_t &bufferDescriptor, uint32_t count, IAllocator::allocate_cb hidl_cb,
              std::function<int(const buffer_descriptor_t *, buffer_handle_t *)> fb_allocator = nullptr);

} // namespace common
} // namespace allocator
} // namespace arm

#endif /* GRALLOC_COMMON_ALLOCATOR_H */
