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