1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
3*4882a593Smuzhiyun * Authors:
4*4882a593Smuzhiyun * Zhiqin Wei <wzq@rock-chips.com>
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Licensed under the Apache License, Version 2.0 (the "License");
7*4882a593Smuzhiyun * you may not use this file except in compliance with the License.
8*4882a593Smuzhiyun * You may obtain a copy of the License at
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * http://www.apache.org/licenses/LICENSE-2.0
11*4882a593Smuzhiyun *
12*4882a593Smuzhiyun * Unless required by applicable law or agreed to in writing, software
13*4882a593Smuzhiyun * distributed under the License is distributed on an "AS IS" BASIS,
14*4882a593Smuzhiyun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15*4882a593Smuzhiyun * See the License for the specific language governing permissions and
16*4882a593Smuzhiyun * limitations under the License.
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun #ifdef ANDROID
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include "GrallocOps.h"
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #if USE_GRALLOC_4
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include "platform_gralloc4.h"
25*4882a593Smuzhiyun
RkRgaGetHandleFd(buffer_handle_t handle,int * fd)26*4882a593Smuzhiyun int RkRgaGetHandleFd(buffer_handle_t handle, int *fd) {
27*4882a593Smuzhiyun int err = 0;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun err = gralloc4::get_share_fd(handle, fd);
30*4882a593Smuzhiyun if (err != android::OK)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun ALOGE("Failed to get buffer share_fd, err : %d", err);
33*4882a593Smuzhiyun return -1;
34*4882a593Smuzhiyun }
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun return err;
37*4882a593Smuzhiyun }
38*4882a593Smuzhiyun
RkRgaGetHandleAttributes(buffer_handle_t handle,std::vector<int> * attrs)39*4882a593Smuzhiyun int RkRgaGetHandleAttributes(buffer_handle_t handle,
40*4882a593Smuzhiyun std::vector<int> *attrs) {
41*4882a593Smuzhiyun uint64_t w, h, size;
42*4882a593Smuzhiyun int pixel_stride, format;
43*4882a593Smuzhiyun int err = 0;
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun err = gralloc4::get_width(handle, &w);
46*4882a593Smuzhiyun if (err != android::OK)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun ALOGE("Failed to get buffer width, err : %d", err);
49*4882a593Smuzhiyun return -1;
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun err = gralloc4::get_height(handle, &h);
53*4882a593Smuzhiyun if (err != android::OK)
54*4882a593Smuzhiyun {
55*4882a593Smuzhiyun ALOGE("Failed to get buffer height, err : %d", err);
56*4882a593Smuzhiyun return -1;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun err = gralloc4::get_pixel_stride(handle, &pixel_stride);
60*4882a593Smuzhiyun if (err != android::OK)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun ALOGE("Failed to get buffer pixel_stride, err : %d", err);
63*4882a593Smuzhiyun return -1;
64*4882a593Smuzhiyun }
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun err = gralloc4::get_format_requested(handle, &format);
67*4882a593Smuzhiyun if (err != android::OK)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun ALOGE("Failed to get buffer format, err : %d", err);
70*4882a593Smuzhiyun return -1;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun err = gralloc4::get_allocation_size(handle, &size);
74*4882a593Smuzhiyun if (err != android::OK)
75*4882a593Smuzhiyun {
76*4882a593Smuzhiyun ALOGE("Failed to get buffer size, err : %d", err);
77*4882a593Smuzhiyun return -1;
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun //add to attrs.
81*4882a593Smuzhiyun attrs->emplace_back(w);
82*4882a593Smuzhiyun attrs->emplace_back(h);
83*4882a593Smuzhiyun attrs->emplace_back(pixel_stride);
84*4882a593Smuzhiyun attrs->emplace_back(format);
85*4882a593Smuzhiyun attrs->emplace_back(size);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun return err;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
RkRgaGetHandleMapAddress(buffer_handle_t handle,void ** buf)90*4882a593Smuzhiyun int RkRgaGetHandleMapAddress(buffer_handle_t handle,
91*4882a593Smuzhiyun void **buf) {
92*4882a593Smuzhiyun int err;
93*4882a593Smuzhiyun uint64_t w, h;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun err = gralloc4::get_width(handle, &w);
96*4882a593Smuzhiyun if (err != android::OK)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun ALOGE("Failed to get buffer width, err : %d", err);
99*4882a593Smuzhiyun return -1;
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun err = gralloc4::get_height(handle, &h);
103*4882a593Smuzhiyun if (err != android::OK)
104*4882a593Smuzhiyun {
105*4882a593Smuzhiyun ALOGE("Failed to get buffer height, err : %d", err);
106*4882a593Smuzhiyun return -1;
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun err = gralloc4::lock(handle, GRALLOC_USAGE_SW_READ_MASK, 0, 0, w, h,
110*4882a593Smuzhiyun buf);
111*4882a593Smuzhiyun if (err != android::OK)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun ALOGE("Failed to lock buffer, err : %d", err);
114*4882a593Smuzhiyun return -1;
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun gralloc4::unlock(handle);
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun return err;
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun /* ========================================================================== */
123*4882a593Smuzhiyun #else /* #if USE_GRALLOC_4, else is gralloc 0.3 */
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun #ifndef RK3368
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun #ifdef ANDROID_7_DRM
128*4882a593Smuzhiyun #include <hardware/gralloc.h>
129*4882a593Smuzhiyun #else
130*4882a593Smuzhiyun #include <gralloc_priv.h>
131*4882a593Smuzhiyun #endif
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun #else
134*4882a593Smuzhiyun #include <hardware/gralloc.h>
135*4882a593Smuzhiyun #include <hardware/img_gralloc_public.h>
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun #endif /* #ifndef RK3368 */
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /*
140*4882a593Smuzhiyun * Only these macros in rockchip's private gralloc-0.3 header are
141*4882a593Smuzhiyun * needed in librga, and these are defined in different paths for
142*4882a593Smuzhiyun * different Android versions.
143*4882a593Smuzhiyun * So when librga refers to gralloc0.3, it will judge whether
144*4882a593Smuzhiyun * there is a reference to the corresponding path, and if not,
145*4882a593Smuzhiyun * define these macros by itself.
146*4882a593Smuzhiyun */
147*4882a593Smuzhiyun #ifndef GRALLOC_MODULE_PERFORM_GET_HADNLE_PRIME_FD
148*4882a593Smuzhiyun #define GRALLOC_MODULE_PERFORM_GET_HADNLE_PRIME_FD 0x08100002
149*4882a593Smuzhiyun #endif
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun #ifndef GRALLOC_MODULE_PERFORM_GET_HADNLE_ATTRIBUTES
152*4882a593Smuzhiyun #define GRALLOC_MODULE_PERFORM_GET_HADNLE_ATTRIBUTES 0x08100004
153*4882a593Smuzhiyun #endif
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun #ifndef GRALLOC_MODULE_PERFORM_GET_INTERNAL_FORMAT
156*4882a593Smuzhiyun #define GRALLOC_MODULE_PERFORM_GET_INTERNAL_FORMAT 0x08100006
157*4882a593Smuzhiyun #endif
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun #ifndef GRALLOC_MODULE_PERFORM_GET_USAGE
160*4882a593Smuzhiyun #define GRALLOC_MODULE_PERFORM_GET_USAGE 0x0feeff03
161*4882a593Smuzhiyun #endif
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun gralloc_module_t const *mAllocMod = NULL;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun #ifdef RK3368
166*4882a593Smuzhiyun #define private_handle_t IMG_native_handle_t
167*4882a593Smuzhiyun #endif
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun // ---------------------------------------------------------------------------
RkInitAllocModle()170*4882a593Smuzhiyun int RkInitAllocModle() {
171*4882a593Smuzhiyun const hw_module_t *allocMod = NULL;
172*4882a593Smuzhiyun int ret = 0;
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun if (mAllocMod)
175*4882a593Smuzhiyun return 0;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun ret= hw_get_module(GRALLOC_HARDWARE_MODULE_ID, &allocMod);
178*4882a593Smuzhiyun ALOGE_IF(ret, "FATAL:can't find the %s module",GRALLOC_HARDWARE_MODULE_ID);
179*4882a593Smuzhiyun if (ret == 0)
180*4882a593Smuzhiyun mAllocMod = reinterpret_cast<gralloc_module_t const *>(allocMod);
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun return ret;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun #ifndef ANDROID_7_DRM
186*4882a593Smuzhiyun
gralloc_backend_get_fd(private_handle_t * hnd,int * fd)187*4882a593Smuzhiyun int gralloc_backend_get_fd(private_handle_t* hnd, int *fd) {
188*4882a593Smuzhiyun *fd = hnd->share_fd;
189*4882a593Smuzhiyun return 0;
190*4882a593Smuzhiyun }
191*4882a593Smuzhiyun
gralloc_backend_get_attrs(private_handle_t * hnd,void * attrs)192*4882a593Smuzhiyun int gralloc_backend_get_attrs(private_handle_t* hnd, void *attrs) {
193*4882a593Smuzhiyun std::vector<int> *attributes = (std::vector<int> *)attrs;
194*4882a593Smuzhiyun attributes->clear();
195*4882a593Smuzhiyun attributes->push_back(hnd->width);
196*4882a593Smuzhiyun attributes->push_back(hnd->height);
197*4882a593Smuzhiyun attributes->push_back(hnd->stride);
198*4882a593Smuzhiyun attributes->push_back(hnd->format);
199*4882a593Smuzhiyun attributes->push_back(hnd->size);
200*4882a593Smuzhiyun attributes->push_back(hnd->type);
201*4882a593Smuzhiyun return 0;
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun #else
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun #ifdef RK3368
207*4882a593Smuzhiyun
gralloc_backend_get_fd(private_handle_t * hnd,int * fd)208*4882a593Smuzhiyun int gralloc_backend_get_fd(private_handle_t* hnd, int *fd) {
209*4882a593Smuzhiyun *fd = hnd->fd[0];
210*4882a593Smuzhiyun return 0;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
gralloc_backend_get_attrs(private_handle_t * hnd,void * attrs)213*4882a593Smuzhiyun int gralloc_backend_get_attrs(private_handle_t* hnd, void *attrs) {
214*4882a593Smuzhiyun std::vector<int> *attributes = (std::vector<int> *)attrs;
215*4882a593Smuzhiyun attributes->clear();
216*4882a593Smuzhiyun attributes->push_back(hnd->width);
217*4882a593Smuzhiyun attributes->push_back(hnd->height);
218*4882a593Smuzhiyun attributes->push_back(hnd->stride);
219*4882a593Smuzhiyun attributes->push_back(hnd->format);
220*4882a593Smuzhiyun attributes->push_back(hnd->size);
221*4882a593Smuzhiyun attributes->push_back(hnd->type);
222*4882a593Smuzhiyun return 0;
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun #endif //RK3368
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun #endif //ANDROID_7_DRM
228*4882a593Smuzhiyun
RkRgaGetHandleFd(buffer_handle_t handle,int * fd)229*4882a593Smuzhiyun int RkRgaGetHandleFd(buffer_handle_t handle, int *fd) {
230*4882a593Smuzhiyun int ret = 0;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun if (!mAllocMod)
233*4882a593Smuzhiyun ret = RkInitAllocModle();
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun if (ret)
236*4882a593Smuzhiyun return ret;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun #ifdef ANDROID_7_DRM
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun #ifndef RK3368
241*4882a593Smuzhiyun if (mAllocMod->perform) {
242*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, GRALLOC_MODULE_PERFORM_GET_HADNLE_PRIME_FD, handle, fd);
243*4882a593Smuzhiyun }
244*4882a593Smuzhiyun else
245*4882a593Smuzhiyun return -ENODEV;
246*4882a593Smuzhiyun #else
247*4882a593Smuzhiyun private_handle_t* hnd = (private_handle_t*)handle;
248*4882a593Smuzhiyun ret = gralloc_backend_get_fd(hnd,fd);
249*4882a593Smuzhiyun #endif //RK3368
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun #else
252*4882a593Smuzhiyun private_handle_t* hnd = (private_handle_t*)handle;
253*4882a593Smuzhiyun ret = gralloc_backend_get_fd(hnd,fd);
254*4882a593Smuzhiyun #endif //ANDROID_7_DRM
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun if (ret)
257*4882a593Smuzhiyun ALOGE("GraphicBufferGetHandldFd fail %d for:%s",ret,strerror(ret));
258*4882a593Smuzhiyun else if (false) {
259*4882a593Smuzhiyun ALOGD("fd = %d",*fd);
260*4882a593Smuzhiyun fprintf(stderr,"fd = %d\n", *fd);
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun return ret;
264*4882a593Smuzhiyun }
265*4882a593Smuzhiyun
RkRgaGetHandleAttributes(buffer_handle_t handle,std::vector<int> * attrs)266*4882a593Smuzhiyun int RkRgaGetHandleAttributes(buffer_handle_t handle,
267*4882a593Smuzhiyun std::vector<int> *attrs) {
268*4882a593Smuzhiyun int ret = 0;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun if (!mAllocMod)
271*4882a593Smuzhiyun ret = RkInitAllocModle();
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun if (ret)
274*4882a593Smuzhiyun return ret;
275*4882a593Smuzhiyun
276*4882a593Smuzhiyun #if RK3368_DRM
277*4882a593Smuzhiyun int w,h,pixel_stride,format,size;
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun op = GRALLOC_MODULE_PERFORM_GET_HADNLE_WIDTH;
280*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, &w);
281*4882a593Smuzhiyun op = GRALLOC_MODULE_PERFORM_GET_HADNLE_HEIGHT;
282*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, &h);
283*4882a593Smuzhiyun op = GRALLOC_MODULE_PERFORM_GET_HADNLE_STRIDE;
284*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, &pixel_stride);
285*4882a593Smuzhiyun op = GRALLOC_MODULE_PERFORM_GET_HADNLE_FORMAT;
286*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, &format);
287*4882a593Smuzhiyun op = GRALLOC_MODULE_PERFORM_GET_HADNLE_SIZE;
288*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, &size);
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun //add to attrs.
291*4882a593Smuzhiyun attrs->emplace_back(w);
292*4882a593Smuzhiyun attrs->emplace_back(h);
293*4882a593Smuzhiyun attrs->emplace_back(pixel_stride);
294*4882a593Smuzhiyun attrs->emplace_back(format);
295*4882a593Smuzhiyun attrs->emplace_back(size);
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun #else
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun #ifdef ANDROID_7_DRM
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun #ifndef RK3368
302*4882a593Smuzhiyun int op = GRALLOC_MODULE_PERFORM_GET_HADNLE_ATTRIBUTES;
303*4882a593Smuzhiyun if(!mAllocMod->perform)
304*4882a593Smuzhiyun return -ENODEV;
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun mAllocMod->perform(mAllocMod, op, handle, attrs);
307*4882a593Smuzhiyun #else
308*4882a593Smuzhiyun private_handle_t* hnd = (private_handle_t*)handle;
309*4882a593Smuzhiyun ret = gralloc_backend_get_attrs(hnd, (void*)attrs);
310*4882a593Smuzhiyun #endif //RK3368
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun #else
313*4882a593Smuzhiyun private_handle_t* hnd = (private_handle_t*)handle;
314*4882a593Smuzhiyun ret = gralloc_backend_get_attrs(hnd, (void*)attrs);
315*4882a593Smuzhiyun #endif //ANDROID_7_DRM
316*4882a593Smuzhiyun
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun if (ret)
319*4882a593Smuzhiyun ALOGE("GraphicBufferGetHandldAttributes fail %d for:%s",ret,strerror(ret));
320*4882a593Smuzhiyun else if (false) {
321*4882a593Smuzhiyun ALOGD("%d,%d,%d,%d,%d,%d",attrs->at(0),attrs->at(1),attrs->at(2),
322*4882a593Smuzhiyun attrs->at(3),attrs->at(4),attrs->at(5));
323*4882a593Smuzhiyun fprintf(stderr,"%d,%d,%d,%d,%d,%d\n",
324*4882a593Smuzhiyun attrs->at(0),attrs->at(1),attrs->at(2),
325*4882a593Smuzhiyun attrs->at(3),attrs->at(4),attrs->at(5));
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun #endif
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun return ret;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun
RkRgaGetHandleMapAddress(buffer_handle_t handle,void ** buf)332*4882a593Smuzhiyun int RkRgaGetHandleMapAddress(buffer_handle_t handle,
333*4882a593Smuzhiyun void **buf) {
334*4882a593Smuzhiyun int usage = GRALLOC_USAGE_SW_READ_MASK | GRALLOC_USAGE_SW_WRITE_MASK;
335*4882a593Smuzhiyun #ifdef ANDROID_7_DRM
336*4882a593Smuzhiyun usage |= GRALLOC_USAGE_HW_FB;
337*4882a593Smuzhiyun #endif
338*4882a593Smuzhiyun int ret = 0;
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun if (!mAllocMod)
341*4882a593Smuzhiyun ret = RkInitAllocModle();
342*4882a593Smuzhiyun
343*4882a593Smuzhiyun if (ret)
344*4882a593Smuzhiyun return ret;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun if (mAllocMod->lock)
347*4882a593Smuzhiyun ret = mAllocMod->lock(mAllocMod, handle, usage, 0, 0, 0, 0, buf);
348*4882a593Smuzhiyun else
349*4882a593Smuzhiyun return -ENODEV;
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun if (ret)
352*4882a593Smuzhiyun ALOGE("GetHandleMapAddress fail %d for:%s",ret,strerror(ret));
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun return ret;
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun #endif //USE_GRALLOC_4
358*4882a593Smuzhiyun #endif /* ANDROID */
359