| /* |
| * Copyright (C) 2008, The Android Open Source Project |
| * Copyright (c) 2011-2012, The Linux Foundation. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <unistd.h> |
| #include <fcntl.h> |
| |
| #include <sys/mman.h> |
| #include <sys/stat.h> |
| #include <sys/types.h> |
| #include <sys/ioctl.h> |
| #include <cutils/properties.h> |
| |
| #include "gr.h" |
| #include "gpu.h" |
| #include "memalloc.h" |
| #include "alloc_controller.h" |
| |
| using namespace gralloc; |
| |
| int fb_device_open(const hw_module_t* module, const char* name, |
| hw_device_t** device); |
| |
| static int gralloc_device_open(const hw_module_t* module, const char* name, |
| hw_device_t** device); |
| |
| extern int gralloc_lock(gralloc_module_t const* module, |
| buffer_handle_t handle, int usage, |
| int l, int t, int w, int h, |
| void** vaddr); |
| |
| extern int gralloc_lock_ycbcr(gralloc_module_t const* module, |
| buffer_handle_t handle, int usage, |
| int l, int t, int w, int h, |
| struct android_ycbcr *ycbcr); |
| |
| extern int gralloc_unlock(gralloc_module_t const* module, |
| buffer_handle_t handle); |
| |
| extern int gralloc_register_buffer(gralloc_module_t const* module, |
| buffer_handle_t handle); |
| |
| extern int gralloc_unregister_buffer(gralloc_module_t const* module, |
| buffer_handle_t handle); |
| |
| extern int gralloc_perform(struct gralloc_module_t const* module, |
| int operation, ... ); |
| |
| // HAL module methods |
| static struct hw_module_methods_t gralloc_module_methods = { |
| .open = gralloc_device_open |
| }; |
| |
| // HAL module initialize |
| struct private_module_t HAL_MODULE_INFO_SYM = { |
| .base = { |
| .common = { |
| .tag = HARDWARE_MODULE_TAG, |
| .version_major = 1, |
| .version_minor = 0, |
| .id = GRALLOC_HARDWARE_MODULE_ID, |
| .name = "Graphics Memory Allocator Module", |
| .author = "The Android Open Source Project", |
| .methods = &gralloc_module_methods, |
| .dso = 0, |
| .reserved = {0}, |
| }, |
| .registerBuffer = gralloc_register_buffer, |
| .unregisterBuffer = gralloc_unregister_buffer, |
| .lock = gralloc_lock, |
| .unlock = gralloc_unlock, |
| .perform = gralloc_perform, |
| .lock_ycbcr = gralloc_lock_ycbcr, |
| }, |
| .framebuffer = 0, |
| .fbFormat = 0, |
| .flags = 0, |
| .numBuffers = 0, |
| .bufferMask = 0, |
| .lock = PTHREAD_MUTEX_INITIALIZER, |
| }; |
| |
| // Open Gralloc device |
| int gralloc_device_open(const hw_module_t* module, const char* name, |
| hw_device_t** device) |
| { |
| int status = -EINVAL; |
| if (!strcmp(name, GRALLOC_HARDWARE_GPU0)) { |
| const private_module_t* m = reinterpret_cast<const private_module_t*>( |
| module); |
| gpu_context_t *dev; |
| IAllocController* alloc_ctrl = IAllocController::getInstance(); |
| dev = new gpu_context_t(m, alloc_ctrl); |
| if(!dev) |
| return status; |
| |
| *device = &dev->common; |
| status = 0; |
| } else { |
| status = fb_device_open(module, name, device); |
| } |
| return status; |
| } |