gralloc.cpp revision 55a3039bed7dbb6694c0bfcd3bb621be3ab955db
12480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/* 22480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Copyright (C) 2008 The Android Open Source Project 32480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * 42480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Licensed under the Apache License, Version 2.0 (the "License"); 52480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * you may not use this file except in compliance with the License. 62480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * You may obtain a copy of the License at 72480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * 82480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * http://www.apache.org/licenses/LICENSE-2.0 92480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * 102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * Unless required by applicable law or agreed to in writing, software 112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * distributed under the License is distributed on an "AS IS" BASIS, 122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * See the License for the specific language governing permissions and 142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * limitations under the License. 152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */ 162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#ifdef HAVE_ANDROID_OS // just want PAGE_SIZE define 182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <asm/page.h> 192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#else 202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin# include <sys/user.h> 212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#endif 222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <limits.h> 232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <unistd.h> 242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <fcntl.h> 252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <errno.h> 262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <pthread.h> 272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <stdlib.h> 282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <string.h> 292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/mman.h> 312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/stat.h> 322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/types.h> 332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <sys/ioctl.h> 342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <ion/ion.h> 362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <linux/ion.h> 372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/log.h> 382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <cutils/atomic.h> 392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/hardware.h> 412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include <hardware/gralloc.h> 422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gralloc_priv.h" 442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "exynos_format.h" 452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#include "gr.h" 462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct gralloc_context_t { 502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin alloc_device_t device; 512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* our private data here */ 522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc_buffer(alloc_device_t* dev, 552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t size, int usage, buffer_handle_t* pHandle); 562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint fb_device_open(const hw_module_t* module, const char* name, 602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_device_open(const hw_module_t* module, const char* name, 632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device); 642480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_lock(gralloc_module_t const* module, 662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle, int usage, 672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int l, int t, int w, int h, 682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin void** vaddr); 692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unlock(gralloc_module_t const* module, 712480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 722480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_register_buffer(gralloc_module_t const* module, 742480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 752480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinextern int gralloc_unregister_buffer(gralloc_module_t const* module, 772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle); 782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic struct hw_module_methods_t gralloc_module_methods = { 822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinopen: gralloc_device_open 832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstruct private_module_t HAL_MODULE_INFO_SYM = { 862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinbase: { 872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavincommon: { 882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavintag: HARDWARE_MODULE_TAG, 892480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin version_major: 1, 902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin version_minor: 0, 912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin id: GRALLOC_HARDWARE_MODULE_ID, 922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin name: "Graphics Memory Allocator Module", 932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin author: "The Android Open Source Project", 942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin methods: &gralloc_module_methods 952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin }, 96ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin registerBuffer: gralloc_register_buffer, 97ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unregisterBuffer: gralloc_unregister_buffer, 98ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin lock: gralloc_lock, 99ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin unlock: gralloc_unlock, 1002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin }, 101ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin framebuffer: 0, 102ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin flags: 0, 103ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin numBuffers: 0, 104ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin bufferMask: 0, 105ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin lock: PTHREAD_MUTEX_INITIALIZER, 106ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin currentBuffer: 0, 107ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin ionfd: -1, 1082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin}; 1092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 1112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin#define ALIGN(x, a) (((x) + (a - 1)) & ~(a - 1)) 1132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 114da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavinstatic int gralloc_alloc_rgb(int ionfd, int w, int h, int format, int usage, 115da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags, private_handle_t **hnd, int *stride) 1162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 1172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t size, bpr; 11870212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin int bpp = 0, vstride, fd, err; 1192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 1202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_8888: 1212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBX_8888: 1222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BGRA_8888: 1232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 4; 1242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_888: 1262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 3; 1272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGB_565: 1292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_5551: 1302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RGBA_4444: 1312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_RAW_SENSOR: 1322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 2; 1332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_BLOB: 1352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpp = 1; 1362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 1372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 1382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 1392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 1402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin bpr = ALIGN(w*bpp, 16); 14170212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin vstride = ALIGN(h, 16); 14270212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin size = bpr * vstride; 1432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *stride = bpr / bpp; 1442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size = ALIGN(size, PAGE_SIZE); 1452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 146da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM, ion_flags, 147da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &fd); 148da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, 149da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin vstride); 1502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 1522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 1532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 15455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_framework_yuv(int ionfd, int w, int h, int format, 15555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 15655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 15755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin{ 15855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size_t size; 15955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int err, fd; 16055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 16155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin switch (format) { 16255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 16355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = ALIGN(w, 16); 16455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 16555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 16655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *stride = w; 16755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin break; 16855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin default: 16955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 17055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return -EINVAL; 17155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin } 17255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 17355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin size = *stride * h * 3 / 2; 17455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin err = ion_alloc_fd(ionfd, size, 0, 1 << ION_HEAP_TYPE_SYSTEM, 17555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, &fd); 17655a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin if (err) 17755a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 17855a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 17955a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin *hnd = new private_handle_t(fd, size, usage, w, h, format, *stride, h); 18055a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return err; 18155a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin} 18255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin 18355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavinstatic int gralloc_alloc_yuv(int ionfd, int w, int h, int format, 18455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin int usage, unsigned int ion_flags, 18555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin private_handle_t **hnd, int *stride) 1862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 1872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t luma_size, chroma_size; 1882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err, planes, fd, fd1, fd2 = 0; 18970212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin size_t luma_vstride; 1902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *stride = ALIGN(w, 16); 1912480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 1922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin switch (format) { 193c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YV12: 1942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin { 19570212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin luma_vstride = ALIGN(h, 16); 19670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 19770212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin chroma_size = (luma_vstride / 2) * ALIGN(*stride / 2, 16); 1982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin planes = 3; 1992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 2002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 201c853be7b9977a6a0402bd5a65c0c32ac9e2fde1dRebecca Schultz Zavin case HAL_PIXEL_FORMAT_EXYNOS_YCrCb_420_SP: 2022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP: 2032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED: 2042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin { 2052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin size_t chroma_vstride = ALIGN(h / 2, 32); 20670212e566f17b06d5ce613ab5ef1204334f03b86Rebecca Schultz Zavin luma_vstride = ALIGN(h, 32); 2072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin luma_size = luma_vstride * *stride; 2082480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin chroma_size = chroma_vstride * *stride; 2092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin planes = 2; 2102480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin break; 2112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 21255a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YV12: 21355a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin case HAL_PIXEL_FORMAT_YCrCb_420_SP: 21455a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin return gralloc_alloc_framework_yuv(ionfd, w, h, format, usage, 21555a3039bed7dbb6694c0bfcd3bb621be3ab955dbRebecca Schultz Zavin ion_flags, hnd, stride); 2162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin default: 2172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin ALOGE("invalid yuv format %d\n", format); 2182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 2192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 2202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 221da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, luma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM, 222da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin ion_flags, &fd); 2232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 225da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM, 226da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin ion_flags, 2272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin &fd1); 2282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err1; 2302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (planes == 3) { 2312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin err = ion_alloc_fd(ionfd, chroma_size, 0, 1 << ION_HEAP_TYPE_SYSTEM, 232da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin ion_flags, &fd2); 2332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err2; 2352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 236ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin *hnd = new private_handle_t(fd, fd1, fd2, luma_size, usage, w, h, 237ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin format, *stride, luma_vstride); 238ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } else { 239ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin *hnd = new private_handle_t(fd, fd1, luma_size, usage, w, h, format, 240ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin *stride, luma_vstride); 241ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin } 2422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr2: 2452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd1); 2462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr1: 2472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(fd); 2482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 2502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_alloc(alloc_device_t* dev, 2522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int w, int h, int format, int usage, 2532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t* pHandle, int* pStride) 2542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 2552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int stride; 2562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int err; 257da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin unsigned int ion_flags = 0; 2582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_handle_t *hnd; 2592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!pHandle || !pStride) 2612480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 2622480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2632480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if( (usage & GRALLOC_USAGE_SW_READ_MASK) == GRALLOC_USAGE_SW_READ_OFTEN ) 264da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin ion_flags = ION_FLAG_CACHED; 2652480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2662480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t* m = reinterpret_cast<private_module_t*> 2672480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 2682480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*> 2692480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin (dev->common.module); 2702480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 271da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_rgb(m->ionfd, w, h, format, usage, ion_flags, &hnd, 272da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &stride); 2732480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 274da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin err = gralloc_alloc_yuv(m->ionfd, w, h, format, usage, ion_flags, 275da3d871233c291dd2c472c4a7f6bfe35e7c06fc9Rebecca Schultz Zavin &hnd, &stride); 2762480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err) 2772480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2782480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2792480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin err = grallocMap(module, hnd); 2802480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2812480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (err != 0) 2822480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin goto err; 2832480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2842480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pHandle = hnd; 2852480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *pStride = stride; 2862480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 2872480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinerr: 2882480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 289ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 2902480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 291ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 2922480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 2932480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return err; 2942480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 2952480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 2962480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_free(alloc_device_t* dev, 2972480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin buffer_handle_t handle) 2982480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 2992480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (private_handle_t::validate(handle) < 0) 3002480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return -EINVAL; 3012480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3022480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_handle_t const* hnd = reinterpret_cast<private_handle_t const*>(handle); 3032480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_module_t* module = reinterpret_cast<gralloc_module_t*>( 3042480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->common.module); 3052480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3062480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin grallocUnmap(module, const_cast<private_handle_t*>(hnd)); 3072480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd); 308ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd1 >= 0) 3092480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd1); 310ec68ab2185767df2f9487f6501a5ef8d18ce1741Rebecca Schultz Zavin if (hnd->fd2 >= 0) 3112480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin close(hnd->fd2); 3122480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3132480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin delete hnd; 3142480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3152480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3162480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3172480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin/*****************************************************************************/ 3182480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3192480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinstatic int gralloc_close(struct hw_device_t *dev) 3202480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3212480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t* ctx = reinterpret_cast<gralloc_context_t*>(dev); 3222480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (ctx) { 3232480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* TODO: keep a list of all buffer_handle_t created, and free them 3242480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin * all here. 3252480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin */ 3262480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin free(ctx); 3272480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 3282480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return 0; 3292480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 3302480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3312480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavinint gralloc_device_open(const hw_module_t* module, const char* name, 3322480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin hw_device_t** device) 3332480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin{ 3342480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin int status = -EINVAL; 3352480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { 3362480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin gralloc_context_t *dev; 3372480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev = (gralloc_context_t*)malloc(sizeof(*dev)); 3382480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3392480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize our state here */ 3402480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin memset(dev, 0, sizeof(*dev)); 3412480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3422480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin /* initialize the procs */ 3432480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.tag = HARDWARE_DEVICE_TAG; 3442480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.version = 0; 3452480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.module = const_cast<hw_module_t*>(module); 3462480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.common.close = gralloc_close; 3472480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3482480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.alloc = gralloc_alloc; 3492480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin dev->device.free = gralloc_free; 3502480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3512480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin private_module_t *p = reinterpret_cast<private_module_t*>(dev->device.common.module); 3522480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin p->ionfd = ion_open(); 3532480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin 3542480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin *device = &dev->device.common; 3552480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = 0; 3562480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } else { 3572480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin status = fb_device_open(module, name, device); 3582480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin } 3592480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin return status; 3602480eccc3025c1a888e233e2ffbd3c098395de15Rebecca Schultz Zavin} 361