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