gralloc.cpp revision 55a3039bed7dbb6694c0bfcd3bb621be3ab955db
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        },
96ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    registerBuffer: gralloc_register_buffer,
97ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unregisterBuffer: gralloc_unregister_buffer,
98ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    lock: gralloc_lock,
99ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    unlock: gralloc_unlock,
1002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin      },
101ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    framebuffer: 0,
102ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    flags: 0,
103ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    numBuffers: 0,
104ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    bufferMask: 0,
105ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    lock: PTHREAD_MUTEX_INITIALIZER,
106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    currentBuffer: 0,
107ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca 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
15455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format,
15555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       int usage, unsigned int ion_flags,
15655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                       private_handle_t **hnd, int *stride)
15755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{
15855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size_t size;
15955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    int err, fd;
16055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
16155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    switch (format) {
16255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
16355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = ALIGN(w, 16);
16455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
16555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
16655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            *stride = w;
16755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            break;
16855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        default:
16955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        ALOGE("invalid yuv format %d\n", format);
17055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        return -EINVAL;
17155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    }
17255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
17355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    size = *stride * h * 3 / 2;
17455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
17555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                       ion_flags, &fd);
17655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    if (err)
17755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        return err;
17855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
17955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h);
18055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin    return err;
18155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin}
18255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin
18355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format,
18455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             int usage, unsigned int ion_flags,
18555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                             private_handle_t **hnd, int *stride)
1862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
1872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    size_t luma_size, chroma_size;
1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err, planes, fd, fd1, fd2 = 0;
18970212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin    size_t luma_vstride;
1902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *stride = ALIGN(w, 16);
1912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
1922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    switch (format) {
193c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YV12:
1942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        {
19570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_vstride = ALIGN(h, 16);
19670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_size = luma_vstride * *stride;
19770212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16);
1982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            planes = 3;
1992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
2002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        }
201c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP:
2022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP:
2032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
2042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        {
2052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            size_t chroma_vstride = ALIGN(h / 2, 32);
20670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin            luma_vstride = ALIGN(h, 32);
2072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            luma_size = luma_vstride * *stride;
2082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            chroma_size = chroma_vstride * *stride;
2092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            planes = 2;
2102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            break;
2112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        }
21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YV12:
21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin        case HAL_PIXEL_FORMAT_YCrCb_420_SP:
21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin            return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage,
21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin                                               ion_flags, hnd, stride);
2162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        default:
2172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        ALOGE("invalid yuv format %d\n", format);
2182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
2192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
2202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
221da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, luma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
222da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       ion_flags, &fd);
2232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
225da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
226da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                       ion_flags,
2272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                       &fd1);
2282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err1;
2302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (planes == 3) {
2312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM,
232da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                           ion_flags, &fd2);
2332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        if (err)
2342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin            goto err2;
2352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
236ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin        *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h,
237ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin                                    format, *stride, luma_vstride);
238ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    } else {
239ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin        *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format,
240ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin                                    *stride, luma_vstride);
241ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    }
2422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2:
2452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd1);
2462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1:
2472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(fd);
2482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev,
2522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         int w, int h, int format, int usage,
2532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                         buffer_handle_t* pHandle, int* pStride)
2542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int stride;
2562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int err;
257da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    unsigned int ion_flags = 0;
2582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t *hnd;
2592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!pHandle || !pStride)
2612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
2622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN )
264da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        ion_flags = ION_FLAG_CACHED;
2652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_module_t* m = reinterpret_cast<private_module_t*>
2672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
2682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>
2692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        (dev->common.module);
2702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
271da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin    err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd,
272da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                            &stride);
2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
274da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin        err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags,
275da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin                                &hnd, &stride);
2762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err)
2772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return err;
2782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    err = grallocMap(module, hnd);
2802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (err != 0)
2822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        goto err;
2832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pHandle = hnd;
2852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    *pStride = stride;
2862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
2872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr:
2882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
289ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
2902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
291ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
2922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
2932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return err;
2942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
2952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
2962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev,
2972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        buffer_handle_t handle)
2982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
2992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (private_handle_t::validate(handle) < 0)
3002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        return -EINVAL;
3012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle);
3032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>(
3042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                                                                   dev->common.module);
3052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    grallocUnmap(module, const_cast<private_handle_t*>(hnd));
3072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    close(hnd->fd);
308ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd1 >= 0)
3092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd1);
310ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin    if (hnd->fd2 >= 0)
3112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        close(hnd->fd2);
3122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    delete hnd;
3142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/
3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev)
3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev);
3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (ctx) {
3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* TODO: keep a list of all buffer_handle_t created, and free them
3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         * all here.
3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin         */
3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        free(ctx);
3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
3282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return 0;
3292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name,
3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin                        hw_device_t** device)
3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{
3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    int status = -EINVAL;
3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) {
3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        gralloc_context_t *dev;
3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev = (gralloc_context_t*)malloc(sizeof(*dev));
3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize our state here */
3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        memset(dev, 0, sizeof(*dev));
3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        /* initialize the procs */
3432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.tag = HARDWARE_DEVICE_TAG;
3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.version = 0;
3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.module = const_cast<hw_module_t*>(module);
3462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.common.close = gralloc_close;
3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.alloc = gralloc_alloc;
3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        dev->device.free = gralloc_free;
3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module);
3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        p->ionfd = ion_open();
3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin
3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        *device = &dev->device.common;
3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = 0;
3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    } else {
3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin        status = fb_device_open(module, name, device);
3582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    }
3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin    return status;
3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}
361