gralloc.cpp revision ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8
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 47788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim#define ION_HEAP_EXYNOS_CONTIG_MASK (1 << 4) 48ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_FIMD_VIDEO_MASK (1 << 28) 49ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_MFC_OUTPUT_MASK (1 << 26) 50ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim#define ION_EXYNOS_MFC_INPUT_MASK (1 << 25) 51ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin#define MB_1 (1024*1024) 52ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 53788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t { 572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin alloc_device_t device; 582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* our private data here */ 592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev, 622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t size, int usage, buffer_handle_t* pHandle); 632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name, 672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name, 702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module, 732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle, int usage, 742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int l, int t, int w, int h, 752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin void** vaddr); 762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module, 782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module, 812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module, 842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = { 892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open 902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = { 932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: { 94a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin common: { 95a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin tag: HARDWARE_MODULE_TAG, 96a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin version_major: 1, 97a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin version_minor: 0, 98a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin id: GRALLOC_HARDWARE_MODULE_ID, 99a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin name: "Graphics Memory Allocator Module", 100a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin author: "The Android Open Source Project", 101a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin methods: &gralloc_module_methods 102a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin }, 103ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin registerBuffer: gralloc_register_buffer, 104ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unregisterBuffer: gralloc_unregister_buffer, 105ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin lock: gralloc_lock, 106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unlock: gralloc_unlock, 107a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin}, 108a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinframebuffer: 0, 109a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinflags: 0, 110a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinnumBuffers: 0, 111a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinbufferMask: 0, 112a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinlock: PTHREAD_MUTEX_INITIALIZER, 113a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavincurrentBuffer: 0, 114a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinionfd: -1, 1152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 1162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 1182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 119788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kimstatic unsigned int _select_heap(int usage) 120788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim{ 121788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask; 122788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 123788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim if (usage & GRALLOC_USAGE_PROTECTED) 124788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim heap_mask = ION_HEAP_EXYNOS_CONTIG_MASK; 125788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim else 126788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim heap_mask = ION_HEAP_SYSTEM_MASK; 127788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 128788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim return heap_mask; 129788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim} 130788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 131da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage, 132da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags, private_handle_t **hnd, int *stride) 1332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 134ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin size_t size, bpr, alignment = 0; 13570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int bpp = 0, vstride, fd, err; 136788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask = _select_heap(usage); 137788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 1382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 1392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_8888: 1402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBX_8888: 1412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BGRA_8888: 1422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 4; 1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_888: 1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 3; 1462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_565: 1482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_5551: 1492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_4444: 1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RAW_SENSOR: 1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 2; 1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BLOB: 154d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = w; 155d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = h; 15639433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin size = w * h; 1572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 1592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 161d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin 162d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin if (format != HAL_PIXEL_FORMAT_BLOB) { 163d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin bpr = ALIGN(w*bpp, 16); 164d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = ALIGN(h, 16); 1654cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann if (vstride < h + 2) 1664cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann size = bpr * (h + 2); 167d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin else 168d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = bpr * vstride; 169d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = bpr / bpp; 170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = ALIGN(size, PAGE_SIZE); 171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin } 1722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 173ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin if (usage & GRALLOC_USAGE_PROTECTED) { 174ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin alignment = MB_1; 175ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK; 176ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin } 177ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 178ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags, 179da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &fd); 180da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, 181da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin vstride); 1822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 1842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 1852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 18655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format, 18755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 18855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 18955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{ 19055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size_t size; 19155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int err, fd; 19255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 19355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin switch (format) { 19455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 19555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = ALIGN(w, 16); 19655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 19755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 19855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = w; 19955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 20055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin default: 201bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 202bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin } 20455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size = *stride * h * 3 / 2; 20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM, 20755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, &fd); 20855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin if (err) 20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h); 21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin} 21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format, 21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 21755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 2182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 2192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t luma_size, chroma_size; 2202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err, planes, fd, fd1, fd2 = 0; 22170212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin size_t luma_vstride; 222788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask = _select_heap(usage); 223788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *stride = ALIGN(w, 16); 2252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2267d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 2277d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags); 2287d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) { 2297d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV 2307d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_TEXTURE) { 2317d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_EXYNOS_YV12; 2327d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) { 2337d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M 2347d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2357d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 237c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YV12: 238bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 2396cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim *stride = ALIGN(w, 32); 240bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 16); 241bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 242bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16); 243bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 3; 244bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 245bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 246c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP: 2472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP: 2482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 249bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 250bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin size_t chroma_vstride = ALIGN(h / 2, 32); 251bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 32); 252bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 253bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = chroma_vstride * *stride; 254bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 2; 255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 256bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 25755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 25855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 25955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage, 26055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, hnd, stride); 2617d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang case HAL_PIXEL_FORMAT_YCbCr_422_I: 2627d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang { 2637d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_vstride = h; 2647d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_size = luma_vstride * *stride * 2; 2657d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang chroma_size = 0; 2667d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang planes = 1; 2677d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang break; 2687d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 270bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 271bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 2722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 274ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim if (usage & GRALLOC_USAGE_PROTECTED) 275ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK; 276ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 277788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd); 2782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2807d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 1) { 2817d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, luma_size, usage, w, h, 282ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin format, *stride, luma_vstride); 283ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } else { 2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1); 2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 2867d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err1; 2877d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 3) { 2887d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2); 2897d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 2907d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err2; 2917d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang 2927d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h, 2937d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format, *stride, luma_vstride); 2947d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else { 2957d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format, 2967d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *stride, luma_vstride); 2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 298ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } 2992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2: 3022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd1); 3032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1: 3042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd); 3052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev, 3092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int w, int h, int format, int usage, 3102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t* pHandle, int* pStride) 3112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int stride; 3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err; 314da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags = 0; 315a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin private_handle_t *hnd = NULL; 3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!pHandle || !pStride) 3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN ) 321f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; 3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t* m = reinterpret_cast<private_module_t*> 3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*> 3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 328da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd, 329da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &stride); 3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 331da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags, 332da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &hnd, &stride); 3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err != 0) 3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err; 3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pHandle = hnd; 3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pStride = stride; 3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr: 343a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin if (!hnd) 344a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin return err; 3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 346ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 348ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev, 3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle) 3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (private_handle_t::validate(handle) < 0) 3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle); 3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>( 3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->common.module); 3625258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin if (hnd->base) 3635258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin grallocUnmap(module, const_cast<private_handle_t*>(hnd)); 3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 366ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 368ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin delete hnd; 3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 3762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev) 3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev); 3802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (ctx) { 3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* TODO: keep a list of all buffer_handle_t created, and free them 3822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * all here. 3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */ 3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin free(ctx); 3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name, 3902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device) 3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int status = -EINVAL; 3932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { 3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t *dev; 3952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev = (gralloc_context_t*)malloc(sizeof(*dev)); 3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize our state here */ 3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize the procs */ 4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.version = 0; 4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.close = gralloc_close; 4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.alloc = gralloc_alloc; 4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.free = gralloc_free; 4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module); 4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin p->ionfd = ion_open(); 4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *device = &dev->device.common; 4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = 0; 4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } else { 4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = fb_device_open(module, name, device); 4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return status; 4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 419