gralloc.cpp revision da3d871233c291dd2c472c4a7f6bfe35e7c06fc9
12480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*
22480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Copyright (C) 2008 The Android Open Source Project
32480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
42480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Licensed under the Apache License, Version 2.0 (the "License");
52480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * you may not use this file except in compliance with the License.
62480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * You may obtain a copy of the License at
72480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
82480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *      http://www.apache.org/licenses/LICENSE-2.0
92480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *
102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Unless required by applicable law or agreed to in writing, software
112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * distributed under the License is distributed on an "AS IS" BASIS,
122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * See the License for the specific language governing permissions and
142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * limitations under the License.
152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */
162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#ifdef HAVE_ANDROID_OS      // just want PAGE_SIZE define
182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <asm/page.h>
192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#else
202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <sys/user.h>
212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#endif
222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <limits.h>
232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <unistd.h>
242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <fcntl.h>
252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <errno.h>
262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <pthread.h>
272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <stdlib.h>
282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <string.h>
292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/mman.h>
312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/stat.h>
322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/types.h>
332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/ioctl.h>
342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <ion/ion.h>
362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <linux/ion.h>
372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/log.h>
382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/atomic.h>
392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/hardware.h>
412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/gralloc.h>
422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gralloc_priv.h"
442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "exynos_format.h"
452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gr.h"
462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t {
502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    alloc_device_t  device;
512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    /* our private data here */
522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev,
552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                size_t size, int usage, buffer_handle_t* pHandle);
562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name,
602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                   hw_device_t** device);
612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name,
632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                               hw_device_t** device);
642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module,
662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle, int usage,
672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        int l, int t, int w, int h,
682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        void** vaddr);
692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module,
712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                          buffer_handle_t handle);
722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module,
742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                   buffer_handle_t handle);
752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module,
772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                     buffer_handle_t handle);
782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = {
822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open
832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = {
862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: {
872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavincommon: {
882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavintag: HARDWARE_MODULE_TAG,
892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     version_major: 1,
902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     version_minor: 0,
912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     id: GRALLOC_HARDWARE_MODULE_ID,
922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     name: "Graphics Memory Allocator Module",
932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     author: "The Android Open Source Project",
942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin     methods: &gralloc_module_methods
952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        },
962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz ZavinregisterBuffer: gralloc_register_buffer,
972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                unregisterBuffer: gralloc_unregister_buffer,
982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                lock: gralloc_lock,
992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                unlock: gralloc_unlock,
1002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin      },
1012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinframebuffer: 0,
1022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             flags: 0,
1032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             numBuffers: 0,
1042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             bufferMask: 0,
1052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             lock: PTHREAD_MUTEX_INITIALIZER,
1062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             currentBuffer: 0,
1072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin             ionfd: -1,
1082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin};
1092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
1112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#define ALIGN(x, a) (((x) + (a - 1)) & ~(a - 1))
1132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
114da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage,
115da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                             unsigned int ion_flags, private_handle_t **hnd, int *stride)
1162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
1172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t size, bpr;
11870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    int bpp = 0, vstride, fd, err;
1192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
1202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_8888:
1212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBX_8888:
1222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BGRA_8888:
1232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 4;
1242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_888:
1262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 3;
1272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGB_565:
1292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_5551:
1302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RGBA_4444:
1312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_RAW_SENSOR:
1322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 2;
1332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_BLOB:
1352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            bpp = 1;
1362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
1382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            return -EINVAL;
1392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
1402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    bpr = ALIGN(w*bpp, 16);
14170212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    vstride = ALIGN(h, 16);
14270212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size = bpr * vstride;
1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = bpr / bpp;
1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size = ALIGN(size, PAGE_SIZE);
1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
146da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM, ion_flags,
147da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       &fd);
148da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride,
149da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                vstride);
1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
154da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format, int usage,
155da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                             unsigned int ion_flags, private_handle_t **hnd, int *stride)
1562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
1572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t luma_size, chroma_size;
1582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err, planes, fd, fd1, fd2 = 0;
15970212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size_t luma_vstride;
1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = ALIGN(w, 16);
1612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
1632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        ALOGE("invalid yuv format %d\n", format);
1642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
1652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        {
16670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_vstride = ALIGN(h, 16);
16770212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_size = luma_vstride * *stride;
16870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
1692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            planes = 3;
1702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        }
1722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
1742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
1752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        {
1762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            size_t chroma_vstride = ALIGN(h / 2, 32);
17770212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_vstride = ALIGN(h, 32);
1782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            luma_size = luma_vstride * *stride;
1792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            chroma_size = chroma_vstride * *stride;
1802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            planes = 2;
1812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
1822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        }
1832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
1842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        ALOGE("invalid yuv format %d\n", format);
1852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
1862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
1872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
188da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, luma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
189da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       ion_flags, &fd);
1902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
1912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
192da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
193da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       ion_flags,
1942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                       &fd1);
1952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
1962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err1;
1972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (planes == 3) {
1982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
199da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                           ion_flags, &fd2);
2002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        if (err)
2012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            goto err2;
2022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
204da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h, format,
20570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin                                *stride, luma_vstride);
2062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2:
2092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd1);
2102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1:
2112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd);
2122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev,
2162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         int w, int h, int format, int usage,
2172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         buffer_handle_t* pHandle, int* pStride)
2182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int stride;
2202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err;
221da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    unsigned int ion_flags = 0;
2222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t *hnd;
2232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!pHandle || !pStride)
2252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
2262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN )
228da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        ion_flags = ION_FLAG_CACHED;
2292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_module_t* m = reinterpret_cast<private_module_t*>
2312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
2322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>
2332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
2342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
235da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd,
236da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                            &stride);
2372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
238da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags,
239da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                &hnd, &stride);
2402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
2422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    err = grallocMap(module, hnd);
2442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err != 0)
2462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err;
2472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pHandle = hnd;
2492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pStride = stride;
2502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
2512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr:
2522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
2532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (hnd->fd1 > 0)
2542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
2552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (hnd->fd2 > 0)
2562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
2572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev,
2612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle)
2622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (private_handle_t::validate(handle) < 0)
2642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
2652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
2672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
2682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                                                   dev->common.module);
2692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    grallocUnmap(module, const_cast<private_handle_t*>(hnd));
2712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
2722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (hnd->fd1 > 0)
2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
2742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (hnd->fd2 > 0)
2752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
2762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    delete hnd;
2782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
2792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
2822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev)
2842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev);
2862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (ctx) {
2872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* TODO: keep a list of all buffer_handle_t created, and free them
2882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         * all here.
2892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         */
2902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        free(ctx);
2912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
2932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name,
2962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        hw_device_t** device)
2972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int status = -EINVAL;
2992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
3002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        gralloc_context_t *dev;
3012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev = (gralloc_context_t*)malloc(sizeof(*dev));
3022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize our state here */
3042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        memset(dev, 0, sizeof(*dev));
3052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize the procs */
3072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.tag = HARDWARE_DEVICE_TAG;
3082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.version = 0;
3092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.module = const_cast<hw_module_t*>(module);
3102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.close = gralloc_close;
3112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.alloc = gralloc_alloc;
3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.free = gralloc_free;
3142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module);
3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        p->ionfd = ion_open();
3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        *device = &dev->device.common;
3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = 0;
3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    } else {
3212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = fb_device_open(module, name, device);
3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return status;
3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
325