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