/*
 * Copyright (C) 2008 The Android Open Source Project
 * Copyright (c) 2011-2012,2014, The Linux Foundation. All rights reserved.
 *
 * 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_GPU_H_
#define GRALLOC_GPU_H_

#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>

#include <cutils/log.h>

#include "gralloc_priv.h"
#include "fb_priv.h"

namespace gralloc {
class IAllocController;
class gpu_context_t : public alloc_device_t {
    public:
    gpu_context_t(const private_module_t* module,
                  IAllocController* alloc_ctrl);

    int gralloc_alloc_buffer(unsigned int size, int usage,
                             buffer_handle_t* pHandle,
                             int bufferType, int format,
                             int width, int height);

    int free_impl(private_handle_t const* hnd);

    int alloc_impl(int w, int h, int format, int usage,
                   buffer_handle_t* pHandle, int* pStride,
                   unsigned int bufferSize = 0);

    static int gralloc_alloc(alloc_device_t* dev, int w, int h,
                             int format, int usage,
                             buffer_handle_t* pHandle,
                             int* pStride);
    int gralloc_alloc_framebuffer_locked(int usage,
                                         buffer_handle_t* pHandle);

    int gralloc_alloc_framebuffer(int usage,
                                  buffer_handle_t* pHandle);

    static int gralloc_free(alloc_device_t* dev, buffer_handle_t handle);

    static int gralloc_alloc_size(alloc_device_t* dev,
                                  int w, int h, int format,
                                  int usage, buffer_handle_t* pHandle,
                                  int* pStride, int bufferSize);

    static int gralloc_close(struct hw_device_t *dev);

    private:
   IAllocController* mAllocCtrl;
    void getGrallocInformationFromFormat(int inputFormat,
                                         int *bufferType);
};
}
#endif  // GRALLOC_GPU_H
