1 /*
2 * Copyright (c) 2011 Intel Corporation. All Rights Reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the
6 * "Software"), to deal in the Software without restriction, including
7 * without limitation the rights to use, copy, modify, merge, publish,
8 * distribute, sub license, and/or sell copies of the Software, and to
9 * permit persons to whom the Software is furnished to do so, subject to
10 * the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the
13 * next paragraph) shall be included in all copies or substantial portions
14 * of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
19 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
20 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
21 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
22 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 *
24 * Authors:
25 * Fei Jiang <fei.jiang@intel.com>
26 * Austin Yuan <austin.yuan@intel.com>
27 *
28 */
29
30 #include "android/psb_gralloc.h"
31 #include <cutils/log.h>
32 #include <utils/threads.h>
33 #include <ui/PixelFormat.h>
34 #include <hardware/gralloc.h>
35 #include <system/graphics.h>
36 #include <hardware/hardware.h>
37 #ifdef BAYTRAIL
38 #include <ufo/gralloc.h>
39 #else
40 #include <hal/hal_public.h>
41 #include <sync/sync.h>
42 #endif
43
44 using namespace android;
45
46 #ifdef LOG_TAG
47 #undef LOG_TAG
48 #endif
49
50 #define LOG_TAG "pvr_drv_video"
51
52 #ifdef BAYTRAIL
53 static const gralloc_module_t *mGralloc;
54 #else
55 static const hw_device_t *mGralloc;
56 #endif
57
gralloc_lock(buffer_handle_t handle,int usage,int left,int top,int width,int height,void ** vaddr)58 int gralloc_lock(buffer_handle_t handle,
59 int usage, int left, int top, int width, int height,
60 void** vaddr)
61 {
62 int err, j;
63
64 if (!mGralloc) {
65 ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__);
66 if (gralloc_init()) {
67 ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID);
68 return -1;
69 }
70 }
71
72 #ifdef BAYTRAIL
73 err = mGralloc->lock(mGralloc, handle, usage,
74 left, top, width, height,
75 vaddr);
76 #else
77 const gralloc1_rect_t r = {
78 .left = left,
79 .top = top,
80 .width = width,
81 .height = height
82 };
83 err = gralloc_lock_async_img(mGralloc, handle, usage, &r, vaddr, -1);
84 #endif
85 ALOGV("gralloc_lock: handle is %p, usage is %x, vaddr is %p.\n", handle, usage, *vaddr);
86 if (err){
87 ALOGE("lock(...) failed %d (%s).\n", err, strerror(-err));
88 return -1;
89 } else {
90 ALOGV("lock returned with address %p\n", *vaddr);
91 }
92
93 return err;
94 }
95
gralloc_unlock(buffer_handle_t handle)96 int gralloc_unlock(buffer_handle_t handle)
97 {
98 int err;
99
100 if (!mGralloc) {
101 ALOGW("%s: gralloc module has not been initialized. Should initialize it first", __func__);
102 if (gralloc_init()) {
103 ALOGE("%s: can't find the %s module", __func__, GRALLOC_HARDWARE_MODULE_ID);
104 return -1;
105 }
106 }
107
108 #ifdef BAYTRAIL
109 err = mGralloc->unlock(mGralloc, handle);
110 #else
111 int releaseFence = -1;
112 err = gralloc_unlock_async_img(mGralloc, handle, &releaseFence);
113 if (releaseFence >= 0) {
114 sync_wait(releaseFence, -1);
115 close(releaseFence);
116 }
117 #endif
118 if (err) {
119 ALOGE("unlock(...) failed %d (%s)", err, strerror(-err));
120 return -1;
121 } else {
122 ALOGV("unlock returned\n");
123 }
124
125 return err;
126 }
127
gralloc_register(buffer_handle_t handle)128 int gralloc_register(buffer_handle_t handle)
129 {
130 int err = 0;
131
132 if (!mGralloc) {
133 ALOGW("%s: gralloc module has not been initialized.", __func__);
134 if (gralloc_init()) {
135 ALOGE("%s: can't find the %s module", __func__,
136 GRALLOC_HARDWARE_MODULE_ID);
137 return -1;
138 }
139 }
140
141 err = gralloc_register_img(mGralloc, handle);
142 if (err) {
143 ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err));
144 return -1;
145 } else {
146 ALOGV("registered buffer %p successfully\n", handle);
147 }
148
149 return err;
150 }
151
gralloc_unregister(buffer_handle_t handle)152 int gralloc_unregister(buffer_handle_t handle)
153 {
154 int err = 0;
155
156 if (!mGralloc) {
157 ALOGW("%s: gralloc module has not been initialized.", __func__);
158 if (gralloc_init()) {
159 ALOGE("%s: can't find the %s module", __func__,
160 GRALLOC_HARDWARE_MODULE_ID);
161 return -1;
162 }
163 }
164
165 err = gralloc_unregister_img(mGralloc, handle);
166 if (err) {
167 ALOGE("%s failed with %d (%s).\n", __func__, err, strerror(-err));
168 return -1;
169 } else {
170 ALOGV("unregistered buffer %p successfully\n", handle);
171 }
172
173 return err;
174 }
175
gralloc_init(void)176 int gralloc_init(void)
177 {
178 int err;
179
180 #ifdef BAYTRAIL
181 err = hw_get_module(GRALLOC_HW_MODULE_ID, (const hw_module_t **)&mGralloc);
182 #else
183 err = gralloc_open_img(&mGralloc);
184 #endif
185 if (err) {
186 ALOGE("FATAL: can't find the %s module", GRALLOC_HARDWARE_MODULE_ID);
187 return -1;
188 } else
189 ALOGD("hw_get_module returned\n");
190
191 return 0;
192 }
193
gralloc_getdisplaystatus(buffer_handle_t handle,int * status)194 int gralloc_getdisplaystatus(buffer_handle_t handle, int* status)
195 {
196 int err;
197
198 #ifdef BAYTRAIL
199 *status = mGralloc->perform(mGralloc, INTEL_UFO_GRALLOC_MODULE_PERFORM_GET_BO_STATUS, handle);
200 err = 0;
201 #else
202 uint32_t _status = 0U;
203 err = gralloc_get_display_status_img(mGralloc, handle, &_status);
204 *status = (int)_status;
205 #endif
206 if (err){
207 ALOGE("gralloc_getdisplaystatus(...) failed %d (%s).\n", err, strerror(-err));
208 return -1;
209 }
210
211 return err;
212 }
213
gralloc_getbuffd(buffer_handle_t handle)214 int gralloc_getbuffd(buffer_handle_t handle)
215 {
216 return ((IMG_native_handle_t*)handle)->fd[0];
217 }
218