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 4788c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#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) 5188c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_SYSTEM_ID 0 5288c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_EXYNOS_CONTIG_ID 4 5388c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin#define ION_HEAP_CHUNK_ID 6 54ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin#define MB_1 (1024*1024) 55ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 56788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t { 602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin alloc_device_t device; 612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* our private data here */ 622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev, 652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t size, int usage, buffer_handle_t* pHandle); 662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name, 702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name, 732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module, 762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle, int usage, 772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int l, int t, int w, int h, 782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin void** vaddr); 792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module, 812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module, 842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module, 872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = { 922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open 932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = { 962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: { 97a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin common: { 98a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin tag: HARDWARE_MODULE_TAG, 99a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin version_major: 1, 100a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin version_minor: 0, 101a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin id: GRALLOC_HARDWARE_MODULE_ID, 102a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin name: "Graphics Memory Allocator Module", 103a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin author: "The Android Open Source Project", 104a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin methods: &gralloc_module_methods 105a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin }, 106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin registerBuffer: gralloc_register_buffer, 107ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unregisterBuffer: gralloc_unregister_buffer, 108ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin lock: gralloc_lock, 109ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unlock: gralloc_unlock, 110a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin}, 111a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinframebuffer: 0, 112a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinflags: 0, 113a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinnumBuffers: 0, 114a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavinbufferMask: 0, 115a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinlock: PTHREAD_MUTEX_INITIALIZER, 116a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz ZavincurrentBuffer: 0, 117a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavinionfd: -1, 1182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 1192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 1212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 122788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kimstatic unsigned int _select_heap(int usage) 123788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim{ 124788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask; 125788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 126788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim if (usage & GRALLOC_USAGE_PROTECTED) 12788c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin heap_mask = (1 << ION_HEAP_EXYNOS_CONTIG_ID); 128788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim else 12988c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin heap_mask = (1 << ION_HEAP_SYSTEM_ID) | (1 << ION_HEAP_CHUNK_ID); 130788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 131788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim return heap_mask; 132788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim} 133788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 134da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage, 135da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags, private_handle_t **hnd, int *stride) 1362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 137ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin size_t size, bpr, alignment = 0; 13870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int bpp = 0, vstride, fd, err; 139788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask = _select_heap(usage); 140788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 1412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 1422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_8888: 1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBX_8888: 1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BGRA_8888: 1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 4; 1462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_888: 1482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 3; 1492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_565: 1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_5551: 1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_4444: 1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RAW_SENSOR: 1542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 2; 1552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BLOB: 157d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = w; 158d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = h; 15939433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin size = w * h; 1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 1622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 1632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 164d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin 165d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin if (format != HAL_PIXEL_FORMAT_BLOB) { 166472449a8299bb7a2a512caaa60424cdbb8e84a97Bartosz Szatkowski bpr = ALIGN(w*bpp, 64); 167d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = ALIGN(h, 16); 1684cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann if (vstride < h + 2) 1694cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann size = bpr * (h + 2); 170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin else 171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = bpr * vstride; 172d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = bpr / bpp; 173d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = ALIGN(size, PAGE_SIZE); 174d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin } 1752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 176ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin if (usage & GRALLOC_USAGE_PROTECTED) { 177ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin alignment = MB_1; 178ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK; 179ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin } 180ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 181ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags, 182da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &fd); 183da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, 184da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin vstride); 1852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 1872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 18955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format, 19055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 19155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 19255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{ 19355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size_t size; 19455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int err, fd; 19588c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin unsigned int heap_mask = _select_heap(usage); 19655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 19755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin switch (format) { 19855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 19955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = ALIGN(w, 16); 200d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin size = (*stride * h) + (ALIGN(*stride / 2, 16) * h); 20155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 20255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = w; 204d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin size = *stride * h * 3 / 2; 20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin default: 207bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 208bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin } 21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21188c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags, &fd); 21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin if (err) 21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h); 21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 21755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin} 21855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format, 22055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 22155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 2222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 2232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t luma_size, chroma_size; 2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err, planes, fd, fd1, fd2 = 0; 22570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin size_t luma_vstride; 226788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask = _select_heap(usage); 227788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 2282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *stride = ALIGN(w, 16); 2292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2307d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 2317d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags); 2327d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) { 2337d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV 2347d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_TEXTURE) { 2357d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_EXYNOS_YV12; 2367d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) { 2377d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M 2387d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2397d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 241c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YV12: 242bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 2436cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim *stride = ALIGN(w, 32); 244bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 16); 245bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 246bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16); 247bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 3; 248bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 249bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 250c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP: 2512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP: 2522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 253bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 254bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin size_t chroma_vstride = ALIGN(h / 2, 32); 255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 32); 256bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 257bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = chroma_vstride * *stride; 258bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 2; 259bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 260bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 26155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 26255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 26355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage, 26455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, hnd, stride); 2657d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang case HAL_PIXEL_FORMAT_YCbCr_422_I: 2667d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang { 2677d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_vstride = h; 2687d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_size = luma_vstride * *stride * 2; 2697d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang chroma_size = 0; 2707d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang planes = 1; 2717d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang break; 2727d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 274bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 275bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 2762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 2772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 278ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim if (usage & GRALLOC_USAGE_PROTECTED) 279ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK; 280ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 281788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd); 2822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 1) { 2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, luma_size, usage, w, h, 286ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin format, *stride, luma_vstride); 287ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } else { 2887d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1); 2897d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 2907d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err1; 2917d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 3) { 2927d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2); 2937d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 2947d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err2; 2957d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang 2967d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h, 2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format, *stride, luma_vstride); 2987d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else { 2997d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format, 3007d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *stride, luma_vstride); 3017d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 302ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } 30306f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray // Set chroma & gamut fields 30406f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray if (!err && *hnd) { 30506f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray if (usage & GRALLOC_USAGE_PRIVATE_CHROMA) { 30606f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->chroma = HAL_PIXEL_CHROMA_BT601_8; 30706f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->gamut = HAL_PIXEL_GAMUT_NARROW_8; 30806f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } else { 30906f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->chroma = HAL_PIXEL_CHROMA_BT709_8; 31006f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->gamut = HAL_PIXEL_GAMUT_WIDE_8; 31106f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } 31206f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } 3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2: 3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd1); 3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1: 3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd); 3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev, 3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int w, int h, int format, int usage, 3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t* pHandle, int* pStride) 3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int stride; 3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err; 328da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags = 0; 329a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin private_handle_t *hnd = NULL; 3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!pHandle || !pStride) 3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN ) 335f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; 3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t* m = reinterpret_cast<private_module_t*> 3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*> 3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 342da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd, 343da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &stride); 3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 345da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags, 346da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &hnd, &stride); 3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 3482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err != 0) 3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err; 3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pHandle = hnd; 3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pStride = stride; 3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr: 357a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin if (!hnd) 358a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin return err; 3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 360ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 362ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev, 3682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle) 3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (private_handle_t::validate(handle) < 0) 3712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle); 3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>( 3752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->common.module); 3765258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin if (hnd->base) 3775258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin grallocUnmap(module, const_cast<private_handle_t*>(hnd)); 3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 380ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 382ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin delete hnd; 3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 3902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev) 3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev); 3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (ctx) { 3952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* TODO: keep a list of all buffer_handle_t created, and free them 3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * all here. 3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */ 3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin free(ctx); 3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name, 4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device) 4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int status = -EINVAL; 4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { 4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t *dev; 4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev = (gralloc_context_t*)malloc(sizeof(*dev)); 4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize our state here */ 4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize the procs */ 4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.version = 0; 4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.close = gralloc_close; 4192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.alloc = gralloc_alloc; 4212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.free = gralloc_free; 4222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module); 4242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin p->ionfd = ion_open(); 4252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *device = &dev->device.common; 4272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = 0; 4282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } else { 4292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = fb_device_open(module, name, device); 4302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 4312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return status; 4322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 433