gralloc.cpp revision be2e1bb9057c8d0666de057743eeb898c78f34b0
1a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev/* 2a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Copyright (C) 2008, The Android Open Source Project 3befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved. 4a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 5a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Licensed under the Apache License, Version 2.0 (the "License"); 6a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * you may not use this file except in compliance with the License. 7a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * You may obtain a copy of the License at 8a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 9a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * http://www.apache.org/licenses/LICENSE-2.0 10a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * 11a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * Unless required by applicable law or agreed to in writing, software 12a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * distributed under the License is distributed on an "AS IS" BASIS, 13a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * See the License for the specific language governing permissions and 15a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev * limitations under the License. 16a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev */ 17a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 18a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <unistd.h> 19a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <fcntl.h> 20a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 21a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/mman.h> 22a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/stat.h> 23a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/types.h> 24a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <sys/ioctl.h> 25a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <cutils/properties.h> 26a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 27a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include <linux/android_pmem.h> 28a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 29a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gr.h" 30a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "gpu.h" 31a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "memalloc.h" 32a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev#include "alloc_controller.h" 33a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 34a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevusing namespace gralloc; 35a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 36a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint fb_device_open(const hw_module_t* module, const char* name, 37befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hw_device_t** device); 38a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 39a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic int gralloc_device_open(const hw_module_t* module, const char* name, 40befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hw_device_t** device); 41a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 42a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevextern int gralloc_lock(gralloc_module_t const* module, 43befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle, int usage, 44befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int l, int t, int w, int h, 45befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed void** vaddr); 46a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 47a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevextern int gralloc_unlock(gralloc_module_t const* module, 48befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle); 49a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 50a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevextern int gralloc_register_buffer(gralloc_module_t const* module, 51befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle); 52a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 53a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevextern int gralloc_unregister_buffer(gralloc_module_t const* module, 54befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed buffer_handle_t handle); 55a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 56a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevextern int gralloc_perform(struct gralloc_module_t const* module, 57befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed int operation, ... ); 58a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 59a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// HAL module methods 60a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstatic struct hw_module_methods_t gralloc_module_methods = { 61befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedopen: gralloc_device_open 62a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev}; 63a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 64a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// HAL module initialize 65a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevstruct private_module_t HAL_MODULE_INFO_SYM = { 66befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedbase: { 67befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed common: { 68befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed tag: HARDWARE_MODULE_TAG, 69befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_major: 1, 70befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed version_minor: 0, 71befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed id: GRALLOC_HARDWARE_MODULE_ID, 72befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed name: "Graphics Memory Allocator Module", 73befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed author: "The Android Open Source Project", 74befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed methods: &gralloc_module_methods, 75befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed dso: 0, 76befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved: {0}, 77befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed }, 78befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed registerBuffer: gralloc_register_buffer, 79befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed unregisterBuffer: gralloc_unregister_buffer, 80befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed lock: gralloc_lock, 81befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed unlock: gralloc_unlock, 82befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed perform: gralloc_perform, 83befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed reserved_proc: {0}, 84befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed }, 85befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedframebuffer: 0, 86befc466069680cb8a65b1f22ad44723d949128c8Naseer AhmedfbFormat: 0, 87befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedflags: 0, 88befc466069680cb8a65b1f22ad44723d949128c8Naseer AhmednumBuffers: 0, 89befc466069680cb8a65b1f22ad44723d949128c8Naseer AhmedbufferMask: 0, 90befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmedlock: PTHREAD_MUTEX_INITIALIZER, 91befc466069680cb8a65b1f22ad44723d949128c8Naseer AhmedcurrentBuffer: 0, 92a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev}; 93a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev 94a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev// Open Gralloc device 95a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchevint gralloc_device_open(const hw_module_t* module, const char* name, 96befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed hw_device_t** device) 97a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev{ 98a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev int status = -EINVAL; 99a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { 100a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev const private_module_t* m = reinterpret_cast<const private_module_t*>( 101befc466069680cb8a65b1f22ad44723d949128c8Naseer Ahmed module); 102a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev gpu_context_t *dev; 103be2e1bb9057c8d0666de057743eeb898c78f34b0Naseer Ahmed IAllocController* alloc_ctrl = IAllocController::getInstance(); 104a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev dev = new gpu_context_t(m, alloc_ctrl); 105a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev *device = &dev->common; 106a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev status = 0; 107a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } else { 108a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev status = fb_device_open(module, name, device); 109a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev } 110a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev return status; 111a19f21d925628239ef52c8ce392fa4ada91df6fcIliyan Malchev} 112