/*
 * Copyright (C) 2018 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.
 */
package android.frameworks.bufferhub@1.0;

import android.hardware.graphics.common@1.2::HardwareBufferDescription;
import IBufferClient;

interface IBufferHub {
    /**
     * Allocates a new buffer.
     *
     * @param description The desired buffer parameters for the new buffer.
     * @param userMetadataSize The size of the user defined metadata in bytes.
     * @return status The result of this operation. NO_ERROR on success,
     *     error code on failure.
     * @return bufferClient An bufferClient interface associated with
     *     the buffer just allocated.
     * @return bufferTraits the struct containing the information of the buffer.
     */
    allocateBuffer(HardwareBufferDescription description,
                   uint32_t userMetadataSize)
        generates (BufferHubStatus status,
                   IBufferClient bufferClient,
                   BufferTraits bufferTraits);

    /**
     * Fetches a bufferClient interface from a provided handle.
     *
     * @param nativeHandle Handle received from allocateBuffer.
     * @return status The result of this operation. NO_ERROR on success,
     *     error code on failure.
     * @return bufferClient An bufferClient interface associated with
     *     the nativeHandle passed in.
     * @return bufferTraits the struct containing the information of the buffer.
     */
    importBuffer(handle nativeHandle)
        generates (BufferHubStatus status,
                   IBufferClient bufferClient,
                   BufferTraits bufferTraits);
};
