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 1412207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann if (format == HAL_PIXEL_FORMAT_RGBA_8888) { 1422207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann bool sw_usage = !!(usage & (GRALLOC_USAGE_SW_READ_MASK | 1432207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann GRALLOC_USAGE_SW_WRITE_MASK)); 1442207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann 1452207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann if (usage & GRALLOC_USAGE_HW_FB) { 1462207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann ALOGW_IF(sw_usage, 1472207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann "framebuffer target should not have SW usage bits; ignoring"); 1482207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann format = HAL_PIXEL_FORMAT_BGRA_8888; 1492207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) { 1502207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann if (sw_usage) 1512207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann return -EINVAL; 1522207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann format = HAL_PIXEL_FORMAT_BGRA_8888; 1532207ac2e1f0555393320bd6fe7c849d359bbd408Greg Hackmann } 154efe80f0e5961d233e54c788d51d08fbd689297a5Greg Hackmann } 155efe80f0e5961d233e54c788d51d08fbd689297a5Greg Hackmann 1562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 1572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_8888: 1582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBX_8888: 1592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BGRA_8888: 1602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 4; 1612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_888: 1632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 3; 1642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_565: 1662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RAW_SENSOR: 1672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 2; 1682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BLOB: 170d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = w; 171d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = h; 17239433170a04f1f9c307d29e3bb2d7d5e11bf7824Rebecca Schultz Zavin size = w * h; 1732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 1752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 1762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 177d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin 178d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin if (format != HAL_PIXEL_FORMAT_BLOB) { 179472449a8299bb7a2a512caaa60424cdbb8e84a97Bartosz Szatkowski bpr = ALIGN(w*bpp, 64); 180d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin vstride = ALIGN(h, 16); 1814cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann if (vstride < h + 2) 1824cc86ec14bdd6f9adf34b1fd7829041a5e4b84a0Greg Hackmann size = bpr * (h + 2); 183d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin else 184d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = bpr * vstride; 185d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin *stride = bpr / bpp; 186d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin size = ALIGN(size, PAGE_SIZE); 187d15fb8b7ac73bcc7b24999f1aadd52835ed4d95dRebecca Schultz Zavin } 1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 189ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin if (usage & GRALLOC_USAGE_PROTECTED) { 190ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin alignment = MB_1; 191ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_FIMD_VIDEO_MASK; 192ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin } 193ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 194ab73a889ad0d4ea853ab41a9f5b0cea11cac3fd8Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, alignment, heap_mask, ion_flags, 195da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &fd); 196da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, 197da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin vstride); 1982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 2012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 20255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format, 20355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 20455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 20555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{ 20655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size_t size; 20755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int err, fd; 20888c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin unsigned int heap_mask = _select_heap(usage); 20955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 21055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin switch (format) { 21155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = ALIGN(w, 16); 213d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin size = (*stride * h) + (ALIGN(*stride / 2, 16) * h); 21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 21655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = w; 217d881a0ce901d839282ba2d4d724b9ae25c9d4e89Rebecca Schultz Zavin size = *stride * h * 3 / 2; 21855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 21955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin default: 220bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 221bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 22255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin } 22355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 22488c9cff4734fb44e5b02ead6e45cc8cc163e790aRebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, 0, heap_mask, ion_flags, &fd); 22555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin if (err) 22655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 22755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 22855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h); 22955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 23055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin} 23155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 23255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format, 23355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 23455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 2352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 2362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t luma_size, chroma_size; 2372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err, planes, fd, fd1, fd2 = 0; 23870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin size_t luma_vstride; 239788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim unsigned int heap_mask = _select_heap(usage); 240788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim 2412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *stride = ALIGN(w, 16); 2422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2437d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) { 2447d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang ALOGV("HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED : usage(%x), flags(%x)\n", usage, ion_flags); 2457d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if ((usage & GRALLOC_USAGE_HW_CAMERA_ZSL) == GRALLOC_USAGE_HW_CAMERA_ZSL) { 2467d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_422_I; // YUYV 2477d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_TEXTURE) { 2487d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_EXYNOS_YV12; 2497d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else if (usage & GRALLOC_USAGE_HW_VIDEO_ENCODER) { 2507d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format = HAL_PIXEL_FORMAT_YCbCr_420_SP; // NV12M 2517d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2527d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 254c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YV12: 255bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 2566cc676b447554079d90b048c1b5bcf4130f2f434Seho Kim *stride = ALIGN(w, 32); 257bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 16); 258bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 259bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16); 260bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 3; 261bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 262bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 263c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP: 2642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP: 2652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 266bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin { 267bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin size_t chroma_vstride = ALIGN(h / 2, 32); 268bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_vstride = ALIGN(h, 32); 269bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 270bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin chroma_size = chroma_vstride * *stride; 271bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin planes = 2; 272bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin break; 273bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin } 27455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 27555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 27655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage, 27755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, hnd, stride); 2787d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang case HAL_PIXEL_FORMAT_YCbCr_422_I: 2797d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang { 2807d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_vstride = h; 2817d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang luma_size = luma_vstride * *stride * 2; 2827d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang chroma_size = 0; 2837d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang planes = 1; 2847d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang break; 2857d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 2862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 287bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 288bcf29611227fe5d7d34061b2b8a05f59ead56ac7Rebecca Schultz Zavin return -EINVAL; 2892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 2902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 291ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim if (usage & GRALLOC_USAGE_PROTECTED) 292ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim ion_flags |= ION_EXYNOS_MFC_OUTPUT_MASK; 293ce73ba18eb7ba692edf7c2ddcdf2163daeccc287Jihyun Kim 294788e20df8364770ea8bca955d6c9d4da55b494efSanghee Kim err = ion_alloc_fd(ionfd, luma_size, 0, heap_mask, ion_flags, &fd); 2952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2977d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 1) { 2987d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, luma_size, usage, w, h, 299ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin format, *stride, luma_vstride); 300ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } else { 3017d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd1); 3027d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 3037d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err1; 3047d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (planes == 3) { 3057d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang err = ion_alloc_fd(ionfd, chroma_size, 0, heap_mask, ion_flags, &fd2); 3067d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang if (err) 3077d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang goto err2; 3087d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang 3097d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h, 3107d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang format, *stride, luma_vstride); 3117d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } else { 3127d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format, 3137d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang *stride, luma_vstride); 3147d5efeeb8590f12075e4c05976083497d9bbd078Sungjoong Kang } 315ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } 31606f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray // Set chroma & gamut fields 31706f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray if (!err && *hnd) { 31806f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray if (usage & GRALLOC_USAGE_PRIVATE_CHROMA) { 31906f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->chroma = HAL_PIXEL_CHROMA_BT601_8; 32006f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->gamut = HAL_PIXEL_GAMUT_NARROW_8; 32106f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } else { 32206f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->chroma = HAL_PIXEL_CHROMA_BT709_8; 32306f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray (*hnd)->gamut = HAL_PIXEL_GAMUT_WIDE_8; 32406f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } 32506f1fa77873867819b1a6c24ba3c9a088ec6360dAlex Ray } 3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2: 3292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd1); 3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1: 3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd); 3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev, 3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int w, int h, int format, int usage, 3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t* pHandle, int* pStride) 3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int stride; 3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err; 341da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags = 0; 342a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin private_handle_t *hnd = NULL; 3432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!pHandle || !pStride) 3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN ) 348f8552390550d9e8acfd3e87c9a306733842b7aa7Rebecca Schultz Zavin ion_flags = ION_FLAG_CACHED | ION_FLAG_CACHED_NEEDS_SYNC; 3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t* m = reinterpret_cast<private_module_t*> 3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*> 3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 355da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd, 356da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &stride); 3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 358da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags, 359da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &hnd, &stride); 3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 3612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err != 0) 3642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err; 3652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pHandle = hnd; 3672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pStride = stride; 3682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr: 370a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin if (!hnd) 371a776338e508221131a2a51d32b9a374a906390dcRebecca Schultz Zavin return err; 3722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 373ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 375ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 3782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev, 3812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle) 3822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (private_handle_t::validate(handle) < 0) 3842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle); 3872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>( 3882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->common.module); 3895258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin if (hnd->base) 3905258c21c1bdeb412c4ad7982d95e587a121f00fcRebecca Schultz Zavin grallocUnmap(module, const_cast<private_handle_t*>(hnd)); 3912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 393ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 395ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin delete hnd; 3992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 4002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 4012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 4032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev) 4052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 4062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev); 4072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (ctx) { 4082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* TODO: keep a list of all buffer_handle_t created, and free them 4092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * all here. 4102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */ 4112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin free(ctx); 4122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 4132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 4142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 4152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name, 4172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device) 4182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 4192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int status = -EINVAL; 4202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { 4212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t *dev; 4222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev = (gralloc_context_t*)malloc(sizeof(*dev)); 4232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize our state here */ 4252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 4262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize the procs */ 4282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 4292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.version = 0; 4302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 4312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.close = gralloc_close; 4322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.alloc = gralloc_alloc; 4342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.free = gralloc_free; 4352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module); 4372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin p->ionfd = ion_open(); 4382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 4392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *device = &dev->device.common; 4402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = 0; 4412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } else { 4422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = fb_device_open(module, name, device); 4432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 4442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return status; 4452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 446