xref: /OK3568_Linux_fs/external/linux-rga/core/NormalRgaApi.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /*
2  * Copyright (C) 2016 Rockchip Electronics Co., Ltd.
3  * Authors:
4  *  Zhiqin Wei <wzq@rock-chips.com>
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include "NormalRga.h"
20 #include "NormalRgaContext.h"
21 #include "rga.h"
22 #ifdef ANDROID
23 #include "GrallocOps.h"
24 #endif
25 
26 int         sina_table[360];
27 int         cosa_table[360];
28 /**********************************************************************
29   =======================================================================
30  **********************************************************************/
31 
32 /* In order to be compatible with RK_FORMAT_XX and HAL_PIXEL_FORMAT_XX,
33  * RK_FORMAT_XX is shifted to the left by 8 bits to distinguish. In order
34  * to be compatible with the old RK_FORMAT_XX definition, a conversion
35  * function is made here. */
RkRgaCompatibleFormat(int format)36 int RkRgaCompatibleFormat(int format) {
37 #if LINUX
38     if (format == 0)
39         return format;
40 
41     if ((format >> 8) != 0) {
42         return format;
43     } else {
44         return format << 8;
45     }
46 #endif
47     return format;
48 }
49 
50 #ifdef ANDROID
RkRgaGetRgaFormatFromAndroid(int format)51 int RkRgaGetRgaFormatFromAndroid(int format) {
52     switch (format) {
53         case HAL_PIXEL_FORMAT_RGB_565:
54             return RK_FORMAT_RGB_565;
55         case HAL_PIXEL_FORMAT_RGB_888:
56             return RK_FORMAT_RGB_888;
57         case HAL_PIXEL_FORMAT_RGBA_8888:
58             return RK_FORMAT_RGBA_8888;
59         case HAL_PIXEL_FORMAT_RGBX_8888:
60             return RK_FORMAT_RGBX_8888;
61         case HAL_PIXEL_FORMAT_BGRA_8888:
62             return RK_FORMAT_BGRA_8888;
63         case HAL_PIXEL_FORMAT_YCrCb_420_SP:
64             return RK_FORMAT_YCrCb_420_SP;
65         case HAL_PIXEL_FORMAT_YCrCb_NV12:
66             return RK_FORMAT_YCbCr_420_SP;
67         case HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO:
68             return RK_FORMAT_YCbCr_420_SP;
69         case HAL_PIXEL_FORMAT_YCrCb_NV12_10:
70             return RK_FORMAT_YCbCr_420_SP_10B; //0x20
71         default:
72             ALOGE("%x is unsupport format now,pilese fix.", format);
73             return -1;
74     }
75 }
76 #endif
77 
RkRgaGetRgaFormat(int format)78 int RkRgaGetRgaFormat(int format) {
79     /* Because the format of librga is the value of driver format << 8 . */
80 #ifdef ANDROID
81     if (format & 0xFF) {
82         format = RkRgaGetRgaFormatFromAndroid(format);
83         if (format < 0)
84             return -1;
85     }
86 #endif
87     if (format & 0xFF00 || format == 0)
88         return format;
89     else {
90         format = RkRgaCompatibleFormat(format);
91         if (format & 0xFF00 || format == 0)
92             return format;
93     }
94 
95     ALOGE("%x is unsupport format now,pilese fix.", format);
96     return -1;
97 }
98 
bytesPerPixel(int format)99 uint32_t bytesPerPixel(int format) {
100     if (!(format & 0xFF00 || format == 0)) {
101         format = RkRgaCompatibleFormat(format);
102     }
103 
104     switch (format) {
105         case RK_FORMAT_RGBA_8888:
106         case RK_FORMAT_RGBX_8888:
107         case RK_FORMAT_BGRA_8888:
108         case RK_FORMAT_BGRX_8888:
109         case RK_FORMAT_ARGB_8888:
110         case RK_FORMAT_XRGB_8888:
111         case RK_FORMAT_ABGR_8888:
112         case RK_FORMAT_XBGR_8888:
113             return 4;
114         case RK_FORMAT_RGB_888:
115         case RK_FORMAT_BGR_888:
116             return 3;
117         case RK_FORMAT_RGB_565:
118         case RK_FORMAT_RGBA_5551:
119         case RK_FORMAT_RGBA_4444:
120         case RK_FORMAT_BGR_565:
121         case RK_FORMAT_BGRA_5551:
122         case RK_FORMAT_BGRA_4444:
123         case RK_FORMAT_ARGB_5551:
124         case RK_FORMAT_ARGB_4444:
125         case RK_FORMAT_ABGR_5551:
126         case RK_FORMAT_ABGR_4444:
127             return 2;
128         case RK_FORMAT_BPP1:
129         case RK_FORMAT_BPP2:
130         case RK_FORMAT_BPP4:
131         case RK_FORMAT_BPP8:
132             return 1;
133     }
134     return 0;
135 }
136 
checkRectForRga(rga_rect_t rect)137 int checkRectForRga(rga_rect_t rect) {
138     if (rect.xoffset < 0 || rect.yoffset < 0) {
139         ALOGE("err offset[%d,%d]", rect.xoffset, rect.yoffset);
140         return -EINVAL;
141     }
142 
143     if (rect.width < 2 || rect.height < 2) {
144         ALOGE("err act[%d,%d]", rect.width, rect.height);
145         return -EINVAL;
146     }
147 
148     if (rect.xoffset + rect.width > rect.wstride) {
149         ALOGE("err ws[%d,%d,%d]", rect.xoffset, rect.width, rect.wstride);
150         return -EINVAL;
151     }
152 
153     if (rect.yoffset + rect.height > rect.hstride) {
154         ALOGE("err hs[%d,%d,%d]", rect.yoffset, rect.height, rect.hstride);
155         return -EINVAL;
156     }
157 
158     if (NormalRgaIsYuvFormat(RkRgaGetRgaFormat(rect.format)) &&
159         ((rect.wstride % 4) ||(rect.xoffset % 2) || (rect.width % 2) ||
160          (rect.yoffset % 2) || (rect.height % 2) || (rect.hstride % 2))) {
161         ALOGE("err yuv not align to 2");
162         return -EINVAL;
163     }
164 
165     return 0;
166 }
167 
isRectValid(rga_rect_t rect)168 int isRectValid(rga_rect_t rect) {
169     return rect.width > 0 && rect.height > 0;
170 }
171 
172 #ifdef ANDROID
NormalRgaGetRects(buffer_handle_t src,buffer_handle_t dst,int * sType,int * dType,drm_rga_t * tmpRects)173 int NormalRgaGetRects(buffer_handle_t src,
174                       buffer_handle_t dst,int* sType,int* dType,drm_rga_t* tmpRects) {
175     int ret = 0;
176     std::vector<int> srcAttrs,dstAttrs;
177     if (src)
178         ret = RkRgaGetHandleAttributes(src, &srcAttrs);
179     if (ret) {
180         ALOGE("dst handle get Attributes fail ret = %d,hnd=%p",ret,&src);
181         printf("dst handle get Attributes fail ret = %d,hnd=%p",ret,&src);
182         return ret;
183     }
184 
185     if (dst)
186         ret = RkRgaGetHandleAttributes(dst, &dstAttrs);
187     if (ret) {
188         ALOGE("dst handle get Attributes fail ret = %d,hnd=%p",ret,&dst);
189         printf("dst handle get Attributes fail ret = %d,hnd=%p",ret,&dst);
190         return ret;
191     }
192 
193     memset(tmpRects,0,sizeof(drm_rga_t));
194 
195     if (src) {
196         tmpRects->src.size = srcAttrs.at(ASIZE);
197         tmpRects->src.width   = srcAttrs.at(AWIDTH);
198         tmpRects->src.height  = srcAttrs.at(AHEIGHT);
199         tmpRects->src.wstride = srcAttrs.at(ASTRIDE);
200         tmpRects->src.format  = srcAttrs.at(AFORMAT);
201         if (sType)
202             *sType = srcAttrs.at(ATYPE);
203     }
204 
205     if (dst) {
206         tmpRects->dst.size = dstAttrs.at(ASIZE);
207         tmpRects->dst.width   = dstAttrs.at(AWIDTH);
208         tmpRects->dst.height  = dstAttrs.at(AHEIGHT);
209         tmpRects->dst.wstride = dstAttrs.at(ASTRIDE);
210         tmpRects->dst.format  = dstAttrs.at(AFORMAT);
211         if (dType)
212             *dType = dstAttrs.at(ATYPE);
213     }
214 
215     return ret;
216 }
217 
NormalRgaGetRect(buffer_handle_t hnd,rga_rect_t * rect)218 int NormalRgaGetRect(buffer_handle_t hnd, rga_rect_t *rect) {
219     int ret = 0;
220     std::vector<int> dstAttrs;
221 
222     if (!rect) {
223         ALOGE("Get rect but rect[%p] is null point", rect);
224         return -EINVAL;
225     }
226 
227     ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
228     if (ret) {
229         ALOGE("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
230         printf("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
231         return ret;
232     }
233 
234     memset(rect, 0, sizeof(rga_rect_t));
235 
236     rect->size = dstAttrs.at(ASIZE);
237     rect->width   = dstAttrs.at(AWIDTH);
238     rect->height  = dstAttrs.at(AHEIGHT);
239     rect->wstride = dstAttrs.at(ASTRIDE);
240     rect->format  = dstAttrs.at(AFORMAT);
241 
242     return ret;
243 }
244 
NormalRgaGetMmuType(buffer_handle_t hnd,int * mmuType)245 int NormalRgaGetMmuType(buffer_handle_t hnd, int *mmuType) {
246     int ret = 0;
247     std::vector<int> dstAttrs;
248 
249     if (!mmuType) {
250         ALOGE("Get rect but mmuType[%p] is null point", mmuType);
251         return -EINVAL;
252     }
253 
254     ret = RkRgaGetHandleAttributes(hnd, &dstAttrs);
255     if (ret) {
256         ALOGE("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
257         printf("dst handle get Attributes fail ret = %d,hnd=%p", ret, &hnd);
258         return ret;
259     }
260 
261     if (dstAttrs.size() >= 5) {
262 #ifdef ANDROID_8
263         *mmuType = dstAttrs.at(ASIZE);
264 #else
265         *mmuType = dstAttrs.at(ATYPE);
266 #endif
267     }
268 
269     return ret;
270 }
271 #endif
272 
NormalRgaSetRect(rga_rect_t * rect,int x,int y,int w,int h,int s,int f)273 int NormalRgaSetRect(rga_rect_t *rect, int x, int y,
274                      int w, int h, int s, int f) {
275     if (!rect)
276         return -EINVAL;
277 
278     rect->xoffset = x;
279     rect->yoffset = y;
280     rect->width = w;
281     rect->height = h;
282     rect->wstride = s;
283     rect->format = f;
284 
285     return 0;
286 }
287 
NormalRgaSetSrcActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)288 int NormalRgaSetSrcActiveInfo(struct rga_req *req,
289                               unsigned int width, unsigned int height,
290                               unsigned int x_off, unsigned int y_off) {
291     req->src.act_w = width;
292     req->src.act_h = height;
293     req->src.x_offset = x_off;
294     req->src.y_offset = y_off;
295 
296     return 1;
297 }
298 
NormalRgaSetFdsOffsets(struct rga_req * req,uint16_t src_fd,uint16_t dst_fd,uint32_t src_offset,uint32_t dst_offset)299 int NormalRgaSetFdsOffsets(struct rga_req *req,
300                            uint16_t src_fd,     uint16_t dst_fd,
301                            uint32_t src_offset, uint32_t dst_offset) {
302     req->line_draw_info.color = src_fd | (dst_fd << 16);
303     req->line_draw_info.flag = src_offset;
304     req->line_draw_info.line_width = dst_offset;
305     return 0;
306 }
307 
308 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetSrcVirtualInfo(struct rga_req * req,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,unsigned int format,unsigned char a_swap_en)309 int NormalRgaSetSrcVirtualInfo(struct rga_req *req,
310                                unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
311                                unsigned int vir_w,unsigned int vir_h, unsigned int format,
312                                unsigned char a_swap_en)
313 #else
314 int NormalRgaSetSrcVirtualInfo(struct rga_req *req,
315                                unsigned int yrgb_addr, unsigned int uv_addr,unsigned int v_addr,
316                                unsigned int vir_w, unsigned int vir_h, unsigned int format,
317                                unsigned char a_swap_en)
318 #endif
319 {
320     req->src.yrgb_addr = yrgb_addr;
321     req->src.uv_addr  = uv_addr;
322     req->src.v_addr   = v_addr;
323     req->src.vir_w = vir_w;
324     req->src.vir_h = vir_h;
325     req->src.format = format >> 8;
326     req->src.alpha_swap |= (a_swap_en & 1);
327 
328     return 1;
329 }
330 
NormalRgaSetDstActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)331 int NormalRgaSetDstActiveInfo(struct rga_req *req,
332                               unsigned int width, unsigned int height,
333                               unsigned int x_off, unsigned int y_off) {
334     req->dst.act_w = width;
335     req->dst.act_h = height;
336     req->dst.x_offset = x_off;
337     req->dst.y_offset = y_off;
338 
339     return 1;
340 }
341 
342 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetDstVirtualInfo(struct rga_req * msg,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,RECT * clip,unsigned int format,unsigned char a_swap_en)343 int NormalRgaSetDstVirtualInfo(struct rga_req *msg,
344                                unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
345                                unsigned int  vir_w,    unsigned int vir_h,
346                                RECT *clip,
347                                unsigned int format, unsigned char a_swap_en)
348 #else
349 int NormalRgaSetDstVirtualInfo(struct rga_req *msg,
350                                unsigned int yrgb_addr,unsigned int uv_addr,  unsigned int v_addr,
351                                unsigned int vir_w,    unsigned int vir_h,
352                                RECT *clip,
353                                unsigned int  format, unsigned char a_swap_en)
354 #endif
355 {
356     msg->dst.yrgb_addr = yrgb_addr;
357     msg->dst.uv_addr  = uv_addr;
358     msg->dst.v_addr   = v_addr;
359     msg->dst.vir_w = vir_w;
360     msg->dst.vir_h = vir_h;
361     msg->dst.format = format >> 8;
362 
363     msg->clip.xmin = clip->xmin;
364     msg->clip.xmax = clip->xmax;
365     msg->clip.ymin = clip->ymin;
366     msg->clip.ymax = clip->ymax;
367 
368     msg->dst.alpha_swap |= (a_swap_en & 1);
369 
370     return 1;
371 }
NormalRgaSetPatActiveInfo(struct rga_req * req,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off)372 int NormalRgaSetPatActiveInfo(struct rga_req *req,
373                               unsigned int width, unsigned int height,
374                               unsigned int x_off, unsigned int y_off) {
375     req->pat.act_w = width;
376     req->pat.act_h = height;
377     req->pat.x_offset = x_off;
378     req->pat.y_offset = y_off;
379 
380     return 1;
381 }
382 
383 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetPatVirtualInfo(struct rga_req * msg,unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,unsigned int vir_w,unsigned int vir_h,RECT * clip,unsigned int format,unsigned char a_swap_en)384 int NormalRgaSetPatVirtualInfo(struct rga_req *msg,
385                                unsigned long yrgb_addr,unsigned long uv_addr,unsigned long v_addr,
386                                unsigned int  vir_w,    unsigned int vir_h,
387                                RECT *clip,
388                                unsigned int format, unsigned char a_swap_en)
389 #else
390 int NormalRgaSetPatVirtualInfo(struct rga_req *msg,
391                                unsigned int yrgb_addr,unsigned int uv_addr,  unsigned int v_addr,
392                                unsigned int vir_w,    unsigned int vir_h,
393                                RECT *clip,
394                                unsigned int  format, unsigned char a_swap_en)
395 #endif
396 {
397     msg->pat.yrgb_addr = yrgb_addr;
398     msg->pat.uv_addr  = uv_addr;
399     msg->pat.v_addr   = v_addr;
400     msg->pat.vir_w = vir_w;
401     msg->pat.vir_h = vir_h;
402     msg->pat.format = format >> 8;
403 
404     msg->clip.xmin = clip->xmin;
405     msg->clip.xmax = clip->xmax;
406     msg->clip.ymin = clip->ymin;
407     msg->clip.ymax = clip->ymax;
408 
409     msg->pat.alpha_swap |= (a_swap_en & 1);
410 
411     return 1;
412 }
413 
NormalRgaSetPatInfo(struct rga_req * msg,unsigned int width,unsigned int height,unsigned int x_off,unsigned int y_off,unsigned int pat_format)414 int NormalRgaSetPatInfo(struct rga_req *msg,
415                         unsigned int width,unsigned int height,unsigned int x_off,
416                         unsigned int y_off, unsigned int pat_format) {
417     msg->pat.act_w = width;
418     msg->pat.act_h = height;
419     msg->pat.x_offset = x_off;
420     msg->pat.y_offset = y_off;
421 
422     msg->pat.format = pat_format >> 8;
423 
424     return 1;
425 }
426 
427 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaSetRopMaskInfo(struct rga_req * msg,unsigned long rop_mask_addr,unsigned int rop_mask_endian_mode)428 int NormalRgaSetRopMaskInfo(struct rga_req *msg,
429                             unsigned long rop_mask_addr,unsigned int rop_mask_endian_mode)
430 #else
431 int NormalRgaSetRopMaskInfo(struct rga_req *msg,
432                             unsigned int rop_mask_addr,unsigned int rop_mask_endian_mode)
433 #endif
434 {
435     msg->rop_mask_addr = rop_mask_addr;
436     msg->endian_mode = rop_mask_endian_mode;
437     return 1;
438 }
439 
440 /* 0:alpha' = alpha + (alpha>>7) | alpha' = alpha */
441 /* 0 global alpha / 1 per pixel alpha / 2 mix mode */
442 
443 /* porter duff alpha mode en */
444 
445 /* use dst alpha  */
446 
NormalRgaSetAlphaEnInfo(struct rga_req * msg,unsigned int alpha_cal_mode,unsigned int alpha_mode,unsigned int global_a_value,unsigned int PD_en,unsigned int PD_mode,unsigned int dst_alpha_en)447 int NormalRgaSetAlphaEnInfo(struct rga_req *msg,
448                             unsigned int alpha_cal_mode, unsigned int alpha_mode,
449                             unsigned int global_a_value, unsigned int PD_en,
450                             unsigned int PD_mode,        unsigned int dst_alpha_en ) {
451     msg->alpha_rop_flag |= 1;
452     msg->alpha_rop_flag |= ((PD_en & 1) << 3);
453     msg->alpha_rop_flag |= ((alpha_cal_mode & 1) << 4);
454 
455     msg->alpha_global_value = global_a_value;
456     msg->alpha_rop_mode |= (alpha_mode & 3);
457     msg->alpha_rop_mode |= (dst_alpha_en << 5);
458 
459     msg->PD_mode = PD_mode;
460 
461 
462     return 1;
463 }
464 
465 
NormalRgaSetRopEnInfo(struct rga_req * msg,unsigned int ROP_mode,unsigned int ROP_code,unsigned int color_mode,unsigned int solid_color)466 int NormalRgaSetRopEnInfo(struct rga_req *msg,
467                           unsigned int ROP_mode, unsigned int ROP_code,
468                           unsigned int color_mode,unsigned int solid_color) {
469     msg->alpha_rop_flag |= (0x3);
470     msg->alpha_rop_mode |= ((ROP_mode & 3) << 2);
471 
472     msg->rop_code = ROP_code;
473     msg->color_fill_mode = color_mode;
474     msg->fg_color = solid_color;
475     return 1;
476 }
477 
NormalRgaSetFadingEnInfo(struct rga_req * msg,unsigned char r,unsigned char g,unsigned char b)478 int NormalRgaSetFadingEnInfo(struct rga_req *msg,
479                              unsigned char r,unsigned char g,unsigned char b) {
480     msg->alpha_rop_flag |= (0x1 << 2);
481 
482     msg->fading.b = b;
483     msg->fading.g = g;
484     msg->fading.r = r;
485     return 1;
486 }
487 
NormalRgaSetSrcTransModeInfo(struct rga_req * msg,unsigned char trans_mode,unsigned char a_en,unsigned char b_en,unsigned char g_en,unsigned char r_en,unsigned int color_key_min,unsigned int color_key_max,unsigned char zero_mode_en)488 int NormalRgaSetSrcTransModeInfo(struct rga_req *msg,
489                                  unsigned char trans_mode,unsigned char a_en,unsigned char b_en,
490                                  unsigned char g_en,unsigned char r_en,unsigned int color_key_min,
491                                  unsigned int color_key_max,unsigned char zero_mode_en
492                                 ) {
493     msg->src_trans_mode = ((a_en & 1) << 4) | ((b_en & 1) << 3) |
494                           ((g_en & 1) << 2) | ((r_en & 1) << 1) | (trans_mode & 1);
495 
496     msg->color_key_min = color_key_min;
497     msg->color_key_max = color_key_max;
498     msg->alpha_rop_mode |= (zero_mode_en << 4);
499     return 1;
500 }
501 
NormalRgaIsBppFormat(int format)502 bool NormalRgaIsBppFormat(int format) {
503     bool ret = false;
504 
505     switch (format) {
506         case RK_FORMAT_BPP1:
507         case RK_FORMAT_BPP2:
508         case RK_FORMAT_BPP4:
509         case RK_FORMAT_BPP8:
510             ret = true;
511             break;
512         default:
513             break;
514     }
515 
516     return ret;
517 }
518 
NormalRgaIsYuvFormat(int format)519 bool NormalRgaIsYuvFormat(int format) {
520     bool ret = false;
521 
522     switch (format) {
523         case RK_FORMAT_YCbCr_422_SP:
524         case RK_FORMAT_YCbCr_422_P:
525         case RK_FORMAT_YCbCr_420_SP:
526         case RK_FORMAT_YCbCr_420_P:
527         case RK_FORMAT_YCrCb_422_SP:
528         case RK_FORMAT_YCrCb_422_P:
529         case RK_FORMAT_YCrCb_420_SP:
530         case RK_FORMAT_YCrCb_420_P:
531         case RK_FORMAT_YVYU_422:
532         case RK_FORMAT_YVYU_420:
533         case RK_FORMAT_VYUY_422:
534         case RK_FORMAT_VYUY_420:
535         case RK_FORMAT_YUYV_422:
536         case RK_FORMAT_YUYV_420:
537         case RK_FORMAT_UYVY_422:
538         case RK_FORMAT_UYVY_420:
539         case RK_FORMAT_Y4:
540         case RK_FORMAT_YCbCr_400:
541         case RK_FORMAT_YCbCr_420_SP_10B:
542         case RK_FORMAT_YCrCb_420_SP_10B:
543         case RK_FORMAT_YCrCb_422_10b_SP:
544         case RK_FORMAT_YCbCr_422_10b_SP:
545             ret = true;
546             break;
547     }
548 
549     return ret;
550 }
551 
NormalRgaIsRgbFormat(int format)552 bool NormalRgaIsRgbFormat(int format) {
553     bool ret = false;
554 
555     switch (format) {
556         case RK_FORMAT_RGBA_8888:
557         case RK_FORMAT_RGBX_8888:
558         case RK_FORMAT_RGBA_5551:
559         case RK_FORMAT_RGBA_4444:
560         case RK_FORMAT_RGB_888:
561         case RK_FORMAT_RGB_565:
562         case RK_FORMAT_BGRA_8888:
563         case RK_FORMAT_BGRX_8888:
564         case RK_FORMAT_BGRA_5551:
565         case RK_FORMAT_BGRA_4444:
566         case RK_FORMAT_BGR_888:
567         case RK_FORMAT_BGR_565:
568         /*ARGB*/
569         case RK_FORMAT_ARGB_8888:
570         case RK_FORMAT_XRGB_8888:
571         case RK_FORMAT_ARGB_5551:
572         case RK_FORMAT_ARGB_4444:
573         case RK_FORMAT_ABGR_8888:
574         case RK_FORMAT_XBGR_8888:
575         case RK_FORMAT_ABGR_5551:
576         case RK_FORMAT_ABGR_4444:
577             ret = true;
578             break;
579         default:
580             break;
581     }
582 
583     return ret;
584 }
585 
NormalRgaFormatHasAlpha(int format)586 bool NormalRgaFormatHasAlpha(int format) {
587     bool ret = false;
588 
589     switch (format) {
590         case RK_FORMAT_RGBA_8888:
591         case RK_FORMAT_RGBA_5551:
592         case RK_FORMAT_RGBA_4444:
593         case RK_FORMAT_BGRA_8888:
594         case RK_FORMAT_BGRA_5551:
595         case RK_FORMAT_BGRA_4444:
596         case RK_FORMAT_ARGB_8888:
597         case RK_FORMAT_ARGB_5551:
598         case RK_FORMAT_ARGB_4444:
599         case RK_FORMAT_ABGR_8888:
600         case RK_FORMAT_ABGR_5551:
601         case RK_FORMAT_ABGR_4444:
602         case RK_FORMAT_RGBA2BPP:
603             ret = true;
604             break;
605         default:
606             break;
607     }
608 
609     return ret;
610 }
611 
612 // 0/near  1/bilnear  2/bicubic
613 // 0/copy 1/rotate_scale 2/x_mirror 3/y_mirror
614 // rotate angle
615 // dither en flag
616 // AA flag
NormalRgaSetBitbltMode(struct rga_req * msg,unsigned char scale_mode,unsigned char rotate_mode,unsigned int angle,unsigned int dither_en,unsigned int AA_en,unsigned int yuv2rgb_mode)617 int NormalRgaSetBitbltMode(struct rga_req *msg,
618                            unsigned char scale_mode,  unsigned char rotate_mode,
619                            unsigned int  angle,       unsigned int  dither_en,
620                            unsigned int  AA_en,       unsigned int  yuv2rgb_mode) {
621     unsigned int alpha_mode;
622     msg->render_mode = bitblt_mode;
623 
624     msg->scale_mode = scale_mode;
625     msg->rotate_mode = rotate_mode;
626 
627     msg->sina = sina_table[angle];
628     msg->cosa = cosa_table[angle];
629 
630     msg->yuv2rgb_mode = yuv2rgb_mode;
631 
632     msg->alpha_rop_flag |= ((dither_en << 5) & 0x20);
633     msg->alpha_rop_flag |= ((AA_en << 7) & 0x80);
634 
635     alpha_mode = msg->alpha_rop_mode & 3;
636     if(rotate_mode == BB_ROTATE) {
637         if (AA_en == ENABLE) {
638             if ((msg->alpha_rop_flag & 0x3) == 0x1) {
639                 if (alpha_mode == 0) {
640                     msg->alpha_rop_mode = 0x2;
641                 } else if (alpha_mode == 1) {
642                     msg->alpha_rop_mode = 0x1;
643                 }
644             } else {
645                 msg->alpha_rop_flag |= 1;
646                 msg->alpha_rop_mode = 1;
647             }
648         }
649     }
650 
651     if (msg->src_trans_mode)
652         msg->scale_mode = 0;
653 
654     return 0;
655 }
656 
657 /* 1bpp/2bpp/4bpp/8bpp */
658 /* src endian mode sel */
659 /* BPP1 = 0 */
660 /* BPP1 = 1 */
NormalRgaSetColorPaletteMode(struct rga_req * msg,unsigned char palette_mode,unsigned char endian_mode,unsigned int bpp1_0_color,unsigned int bpp1_1_color)661 int NormalRgaSetColorPaletteMode(struct rga_req *msg,
662                                  unsigned char  palette_mode,unsigned char  endian_mode,
663                                  unsigned int  bpp1_0_color, unsigned int  bpp1_1_color) {
664     msg->render_mode = color_palette_mode;
665 
666     msg->palette_mode = palette_mode;
667     msg->endian_mode = endian_mode;
668     msg->fg_color = bpp1_0_color;
669     msg->bg_color = bpp1_1_color;
670 
671     return 1;
672 }
673 
674 /* gradient color part         */
675 /* saturation mode             */
676 /* patten fill or solid fill   */
677 /* solid color                 */
678 /* pattern width               */
679 /* pattern height              */
680 /* pattern x offset            */
681 /* pattern y offset            */
682 /* alpha en                    */
NormalRgaSetColorFillMode(struct rga_req * msg,COLOR_FILL * gr_color,unsigned char gr_satur_mode,unsigned char cf_mode,unsigned int color,unsigned short pat_width,unsigned short pat_height,unsigned char pat_x_off,unsigned char pat_y_off,unsigned char aa_en)683 int NormalRgaSetColorFillMode(
684     struct rga_req *msg,                COLOR_FILL  *gr_color,
685     unsigned char  gr_satur_mode,       unsigned char  cf_mode,
686     unsigned int color,                 unsigned short pat_width,
687     unsigned short pat_height,          unsigned char pat_x_off,
688     unsigned char pat_y_off,            unsigned char aa_en) {
689     msg->render_mode = color_fill_mode;
690 
691     msg->gr_color.gr_x_a = ((int)(gr_color->gr_x_a * 256.0))& 0xffff;
692     msg->gr_color.gr_x_b = ((int)(gr_color->gr_x_b * 256.0))& 0xffff;
693     msg->gr_color.gr_x_g = ((int)(gr_color->gr_x_g * 256.0))& 0xffff;
694     msg->gr_color.gr_x_r = ((int)(gr_color->gr_x_r * 256.0))& 0xffff;
695 
696     msg->gr_color.gr_y_a = ((int)(gr_color->gr_y_a * 256.0))& 0xffff;
697     msg->gr_color.gr_y_b = ((int)(gr_color->gr_y_b * 256.0))& 0xffff;
698     msg->gr_color.gr_y_g = ((int)(gr_color->gr_y_g * 256.0))& 0xffff;
699     msg->gr_color.gr_y_r = ((int)(gr_color->gr_y_r * 256.0))& 0xffff;
700 
701     msg->color_fill_mode = cf_mode;
702 
703     msg->pat.act_w = pat_width;
704     msg->pat.act_h = pat_height;
705 
706     msg->pat.x_offset = pat_x_off;
707     msg->pat.y_offset = pat_y_off;
708 
709     msg->fg_color = color;
710 
711     msg->alpha_rop_flag |= ((gr_satur_mode & 1) << 6);
712 
713     if(aa_en) {
714         msg->alpha_rop_flag |= 0x1;
715         msg->alpha_rop_mode  = 1;
716     }
717     return 1;
718 }
719 
720 /* start point              */
721 /* end   point              */
722 /* line point drawing color */
723 /* line width               */
724 /* AA en                    */
725 /* last point en            */
NormalRgaSetLineDrawingMode(struct rga_req * msg,POINT sp,POINT ep,unsigned int color,unsigned int line_width,unsigned char AA_en,unsigned char last_point_en)726 int NormalRgaSetLineDrawingMode(struct rga_req *msg,
727                                 POINT sp,                     POINT  ep,
728                                 unsigned int color,           unsigned int line_width,
729                                 unsigned char AA_en,          unsigned char last_point_en)
730 
731 {
732     msg->render_mode = line_point_drawing_mode;
733 
734     msg->line_draw_info.start_point.x = sp.x;
735     msg->line_draw_info.start_point.y = sp.y;
736     msg->line_draw_info.end_point.x = ep.x;
737     msg->line_draw_info.end_point.y = ep.y;
738 
739     msg->line_draw_info.color = color;
740     msg->line_draw_info.line_width = line_width;
741     msg->line_draw_info.flag |= (AA_en & 1);
742     msg->line_draw_info.flag |= ((last_point_en & 1) << 1);
743 
744     if (AA_en == 1) {
745         msg->alpha_rop_flag = 1;
746         msg->alpha_rop_mode = 0x1;
747     }
748 
749     return 1;
750 }
751 
752 /* blur/sharpness   */
753 /* filter intensity */
754 /* dither_en flag   */
755 
NormalRgaSetBlurSharpFilterMode(struct rga_req * msg,unsigned char filter_mode,unsigned char filter_type,unsigned char dither_en)756 int NormalRgaSetBlurSharpFilterMode(
757     struct rga_req *msg,         unsigned char filter_mode,
758     unsigned char filter_type,   unsigned char dither_en) {
759     msg->render_mode = blur_sharp_filter_mode;
760 
761     msg->bsfilter_flag |= (filter_type & 3);
762     msg->bsfilter_flag |= ((filter_mode & 1) << 2);
763     msg->alpha_rop_flag |= ((dither_en & 1) << 5);
764     return 1;
765 }
766 
NormalRgaSetPreScalingMode(struct rga_req * msg,unsigned char dither_en)767 int NormalRgaSetPreScalingMode(
768     struct rga_req *msg, unsigned char dither_en) {
769     msg->render_mode = pre_scaling_mode;
770 
771     msg->alpha_rop_flag |= ((dither_en & 1) << 5);
772     return 1;
773 }
774 
775 /* LUT table addr      */
776 /* 1bpp/2bpp/4bpp/8bpp */
777 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaUpdatePaletteTableMode(struct rga_req * msg,unsigned long LUT_addr,unsigned int palette_mode)778 int NormalRgaUpdatePaletteTableMode(
779     struct rga_req *msg,unsigned long LUT_addr,unsigned int palette_mode)
780 #else
781 int NormalRgaUpdatePaletteTableMode(
782     struct rga_req *msg,unsigned int LUT_addr, unsigned int palette_mode)
783 #endif
784 {
785     msg->render_mode = update_palette_table_mode;
786 
787     msg->LUT_addr = LUT_addr;
788     msg->palette_mode = palette_mode;
789     return 1;
790 }
791 
792 /* patten addr    */
793 /* patten width   */
794 /* patten height  */
795 /* patten format  */
796 
NormalRgaUpdatePattenBuffMode(struct rga_req * msg,unsigned int pat_addr,unsigned int w,unsigned int h,unsigned int format)797 int NormalRgaUpdatePattenBuffMode(struct rga_req *msg,
798                                   unsigned int pat_addr, unsigned int w,
799                                   unsigned int h,        unsigned int format) {
800     msg->render_mode = update_patten_buff_mode;
801 
802     msg->pat.yrgb_addr   = pat_addr;
803     msg->pat.act_w  = w*h;
804     msg->pat.act_h  = 1;
805     msg->pat.format = format;
806     return 1;
807 }
808 
809 #if defined(__arm64__) || defined(__aarch64__)
NormalRgaMmuInfo(struct rga_req * msg,unsigned char mmu_en,unsigned char src_flush,unsigned char dst_flush,unsigned char cmd_flush,unsigned long base_addr,unsigned char page_size)810 int NormalRgaMmuInfo(struct rga_req *msg,
811                      unsigned char  mmu_en,   unsigned char  src_flush,
812                      unsigned char  dst_flush,unsigned char  cmd_flush,
813                      unsigned long base_addr, unsigned char  page_size)
814 #else
815 int NormalRgaMmuInfo(struct rga_req *msg,
816                      unsigned char  mmu_en,   unsigned char  src_flush,
817                      unsigned char  dst_flush,unsigned char  cmd_flush,
818                      unsigned int base_addr,  unsigned char  page_size)
819 #endif
820 {
821     msg->mmu_info.mmu_en    = mmu_en;
822     msg->mmu_info.base_addr = base_addr;
823     msg->mmu_info.mmu_flag  = ((page_size & 0x3) << 4) |
824                               ((cmd_flush & 0x1) << 3) |
825                               ((dst_flush & 0x1) << 2) |
826                               ((src_flush & 0x1) << 1) | mmu_en;
827     return 1;
828 }
829 
NormalRgaMmuFlag(struct rga_req * msg,int src_mmu_en,int dst_mmu_en)830 int NormalRgaMmuFlag(struct rga_req *msg,
831                      int  src_mmu_en,   int  dst_mmu_en) {
832     if (src_mmu_en || dst_mmu_en)
833         msg->mmu_info.mmu_flag |= (0x1u << 31);
834 
835     if (src_mmu_en)
836         msg->mmu_info.mmu_flag |= (0x1 << 8);
837 
838     if (dst_mmu_en)
839         msg->mmu_info.mmu_flag |= (0x1 << 10);
840 
841     return 1;
842 }
843 
NormalRgaNNQuantizeMode(struct rga_req * msg,rga_info * dst)844 int NormalRgaNNQuantizeMode(struct rga_req *msg, rga_info *dst) {
845     if (dst->nn.nn_flag == 1) {
846         msg->alpha_rop_flag |= (dst->nn.nn_flag << 8);
847 
848         msg->gr_color.gr_x_r = dst->nn.scale_r;
849         msg->gr_color.gr_x_g = dst->nn.scale_g;
850         msg->gr_color.gr_x_b = dst->nn.scale_b;
851 
852         msg->gr_color.gr_y_r = dst->nn.offset_r;
853         msg->gr_color.gr_y_g = dst->nn.offset_g;
854         msg->gr_color.gr_y_b = dst->nn.offset_b;
855     }
856 
857     return 0;
858 }
859 
NormalRgaFullColorSpaceConvert(struct rga_req * msg,int color_space_mode)860 int NormalRgaFullColorSpaceConvert(struct rga_req *msg, int color_space_mode) {
861     typedef struct csc_coe_float_t {
862         float r_v;
863         float g_y;
864         float b_u;
865         float off;
866     } csc_coe_float_t;
867 
868     typedef struct full_csc_float_t {
869         csc_coe_float_t coe_y;
870         csc_coe_float_t coe_u;
871         csc_coe_float_t coe_v;
872     } full_csc_float_t;
873 
874     int factor = 0;
875     full_csc_float_t *fptr = NULL;
876     full_csc_t default_csc_table;
877 
878     /* ABGR => AUYV */
879     static full_csc_float_t default_csc_float_table[] = {
880         /* coe_00 * R + coe_01 * G + coe_02 * B + coe_off */
881         { { 0.299, 0.587, 0.114, 0 }, { -0.169, -0.331, 0.5, 128 }, { 0.5, -0.419, -0.081, 128 } }, //R2Y 601 full
882         { { 0.213, 0.715, 0.072, 0 }, { -0.115, -0.385, 0.5, 128 }, { 0.5, -0.454, -0.046, 128 } }, //R2Y 709 full
883         /* coe_00 * V + coe_01 * Y + coe_02 * U + coe_off */
884         { { -0.1826, 0.8588, -0.1014, 52.3554 }, { 0.1007, -0.0004, 0.8948, 0.5781 }, { 0.9005, 0, 0.0653, 4.3855 } },    //601 full range => 709 limit range
885         { { 0.1916, 1, 0.0993, -37.2476 }, { -0.1106, 0, 0.9895, 15.4669 }, { 0.9827, 0.0002, -0.0723, 11.4231 } },       //709  limit range => 601 limit range
886         { { 0.1685, 0.8588, 0.0872, -16.7232 }, { -0.0971, 0, 0.8695, 29.1335 }, { 0.8638, 0, -0.0637, 25.5824 } },       //709  full range => 601 limit range
887         { { 0.1955, 1, 0.1019, -38.0729 }, { -0.1104, 0, 0.9899, 15.4218 }, { 0.9836, 0, -0.0716, 11.2587 } },            //709  full range => 601 full range
888     };
889 
890     factor = 0x3ff;
891 
892     switch (color_space_mode) {
893         case rgb2yuv_601_full :
894             fptr = &(default_csc_float_table[0]);
895             break;
896 
897         case rgb2yuv_709_full :
898             fptr = &(default_csc_float_table[1]);
899             break;
900 
901         case yuv2yuv_709_limit_2_601_limit :
902             fptr = &(default_csc_float_table[3]);
903             break;
904 
905         case yuv2yuv_601_full_2_709_limit :
906             fptr = &(default_csc_float_table[2]);
907             break;
908 
909         case yuv2yuv_709_full_2_601_limit :
910             fptr = &(default_csc_float_table[4]);
911             break;
912 
913         case yuv2yuv_709_full_2_601_full :
914             fptr = &(default_csc_float_table[5]);
915             break;
916 
917         case yuv2yuv_601_limit_2_709_limit :
918         case yuv2yuv_601_limit_2_709_full :
919         case yuv2yuv_601_full_2_709_full :
920         case yuv2yuv_709_limit_2_601_full :
921         default :
922             printf("Not support full csc mode [%x]\n", color_space_mode);
923             return -1;
924     }
925 
926     /* enable full csc */
927     default_csc_table.flag = 1;
928 
929     /* full csc coefficient */
930     default_csc_table.coe_y.r_v = (int)(fptr->coe_y.r_v * factor +0.5);
931     default_csc_table.coe_y.g_y = (int)(fptr->coe_y.g_y * factor +0.5);
932     default_csc_table.coe_y.b_u = (int)(fptr->coe_y.b_u * factor +0.5);
933     default_csc_table.coe_y.off = (int)(fptr->coe_y.off * factor +0.5);
934 
935     default_csc_table.coe_u.r_v = (int)(fptr->coe_u.r_v * factor +0.5);
936     default_csc_table.coe_u.g_y = (int)(fptr->coe_u.g_y * factor +0.5);
937     default_csc_table.coe_u.b_u = (int)(fptr->coe_u.b_u * factor +0.5);
938     default_csc_table.coe_u.off = (int)(fptr->coe_u.off * factor +0.5);
939 
940     default_csc_table.coe_v.r_v = (int)(fptr->coe_v.r_v * factor +0.5);
941     default_csc_table.coe_v.g_y = (int)(fptr->coe_v.g_y * factor +0.5);
942     default_csc_table.coe_v.b_u = (int)(fptr->coe_v.b_u * factor +0.5);
943     default_csc_table.coe_v.off = (int)(fptr->coe_v.off * factor +0.5);
944 
945     if (color_space_mode >> 8) {
946         msg->full_csc.flag = 1;
947         memcpy(&msg->full_csc, &default_csc_table, sizeof(full_csc_t));
948     }
949 
950     return 0;
951 }
952 
953 
NormalRgaDitherMode(struct rga_req * msg,rga_info * dst,int format)954 int NormalRgaDitherMode(struct rga_req *msg, rga_info *dst, int format)
955 {
956     if (dst->dither.enable == 1)
957     {
958         msg->alpha_rop_flag = 1;
959         msg->alpha_rop_flag |= (dst->dither.enable << 5);
960     }
961 
962     if (format == RK_FORMAT_Y4)
963     {
964         msg->dither_mode = dst->dither.mode;
965 
966         msg->gr_color.gr_x_r = dst->dither.lut0_l;
967         msg->gr_color.gr_x_g = dst->dither.lut0_h;
968         msg->gr_color.gr_y_r = dst->dither.lut1_l;
969         msg->gr_color.gr_y_g = dst->dither.lut1_h;
970     }
971 
972     return 0;
973 }
974 
NormalRgaInitTables()975 int NormalRgaInitTables() {
976     int sinaTable[360] = {
977         0,   1144,   2287,   3430,   4572,   5712,   6850,   7987,   9121,  10252,
978         11380,  12505,  13626,  14742,  15855,  16962,  18064,  19161,  20252,  21336,
979         22415,  23486,  24550,  25607,  26656,  27697,  28729,  29753,  30767,  31772,
980         32768,  33754,  34729,  35693,  36647,  37590,  38521,  39441,  40348,  41243,
981         42126,  42995,  43852,  44695,  45525,  46341,  47143,  47930,  48703,  49461,
982         50203,  50931,  51643,  52339,  53020,  53684,  54332,  54963,  55578,  56175,
983         56756,  57319,  57865,  58393,  58903,  59396,  59870,  60326,  60764,  61183,
984         61584,  61966,  62328,  62672,  62997,  63303,  63589,  63856,  64104,  64332,
985         64540,  64729,  64898,  65048,  65177,  65287,  65376,  65446,  65496,  65526,
986         65536,  65526,  65496,  65446,  65376,  65287,  65177,  65048,  64898,  64729,
987         64540,  64332,  64104,  63856,  63589,  63303,  62997,  62672,  62328,  61966,
988         61584,  61183,  60764,  60326,  59870,  59396,  58903,  58393,  57865,  57319,
989         56756,  56175,  55578,  54963,  54332,  53684,  53020,  52339,  51643,  50931,
990         50203,  49461,  48703,  47930,  47143,  46341,  45525,  44695,  43852,  42995,
991         42126,  41243,  40348,  39441,  38521,  37590,  36647,  35693,  34729,  33754,
992         32768,  31772,  30767,  29753,  28729,  27697,  26656,  25607,  24550,  23486,
993         22415,  21336,  20252,  19161,  18064,  16962,  15855,  14742,  13626,  12505,
994         11380,  10252,   9121,   7987,   6850,   5712,   4572,   3430,   2287,   1144,
995         0,  -1144,  -2287,  -3430,  -4572,  -5712,  -6850,  -7987,  -9121, -10252,
996         -11380, -12505, -13626, -14742, -15855, -16962, -18064, -19161, -20252, -21336,
997         -22415, -23486, -24550, -25607, -26656, -27697, -28729, -29753, -30767, -31772,
998         -32768, -33754, -34729, -35693, -36647, -37590, -38521, -39441, -40348, -41243,
999         -42126, -42995, -43852, -44695, -45525, -46341, -47143, -47930, -48703, -49461,
1000         -50203, -50931, -51643, -52339, -53020, -53684, -54332, -54963, -55578, -56175,
1001         -56756, -57319, -57865, -58393, -58903, -59396, -59870, -60326, -60764, -61183,
1002         -61584, -61966, -62328, -62672, -62997, -63303, -63589, -63856, -64104, -64332,
1003         -64540, -64729, -64898, -65048, -65177, -65287, -65376, -65446, -65496, -65526,
1004         -65536, -65526, -65496, -65446, -65376, -65287, -65177, -65048, -64898, -64729,
1005         -64540, -64332, -64104, -63856, -63589, -63303, -62997, -62672, -62328, -61966,
1006         -61584, -61183, -60764, -60326, -59870, -59396, -58903, -58393, -57865, -57319,
1007         -56756, -56175, -55578, -54963, -54332, -53684, -53020, -52339, -51643, -50931,
1008         -50203, -49461, -48703, -47930, -47143, -46341, -45525, -44695, -43852, -42995,
1009         -42126, -41243, -40348, -39441, -38521, -37590, -36647, -35693, -34729, -33754,
1010         -32768, -31772, -30767, -29753, -28729, -27697, -26656, -25607, -24550, -23486,
1011         -22415, -21336, -20252, -19161, -18064, -16962, -15855, -14742, -13626, -12505,
1012         -11380, -10252, -9121,   -7987,  -6850,  -5712,  -4572,  -3430,  -2287,  -1144
1013     };
1014     int cosaTable[360] = {
1015         65536,  65526,  65496,  65446,  65376,  65287,  65177,  65048,  64898,  64729,
1016         64540,  64332,  64104,  63856,  63589,  63303,  62997,  62672,  62328,  61966,
1017         61584,  61183,  60764,  60326,  59870,  59396,  58903,  58393,  57865,  57319,
1018         56756,  56175,  55578,  54963,  54332,  53684,  53020,  52339,  51643,  50931,
1019         50203,  49461,  48703,  47930,  47143,  46341,  45525,  44695,  43852,  42995,
1020         42126,  41243,  40348,  39441,  38521,  37590,  36647,  35693,  34729,  33754,
1021         32768,  31772,  30767,  29753,  28729,  27697,  26656,  25607,  24550,  23486,
1022         22415,  21336,  20252,  19161,  18064,  16962,  15855,  14742,  13626,  12505,
1023         11380,  10252,   9121,   7987,   6850,   5712,   4572,   3430,   2287,   1144,
1024         0,  -1144,  -2287,  -3430,  -4572,  -5712,  -6850,  -7987,  -9121, -10252,
1025         -11380, -12505, -13626, -14742, -15855, -16962, -18064, -19161, -20252, -21336,
1026         -22415, -23486, -24550, -25607, -26656, -27697, -28729, -29753, -30767, -31772,
1027         -32768, -33754, -34729, -35693, -36647, -37590, -38521, -39441, -40348, -41243,
1028         -42126, -42995, -43852, -44695, -45525, -46341, -47143, -47930, -48703, -49461,
1029         -50203, -50931, -51643, -52339, -53020, -53684, -54332, -54963, -55578, -56175,
1030         -56756, -57319, -57865, -58393, -58903, -59396, -59870, -60326, -60764, -61183,
1031         -61584, -61966, -62328, -62672, -62997, -63303, -63589, -63856, -64104, -64332,
1032         -64540, -64729, -64898, -65048, -65177, -65287, -65376, -65446, -65496, -65526,
1033         -65536, -65526, -65496, -65446, -65376, -65287, -65177, -65048, -64898, -64729,
1034         -64540, -64332, -64104, -63856, -63589, -63303, -62997, -62672, -62328, -61966,
1035         -61584, -61183, -60764, -60326, -59870, -59396, -58903, -58393, -57865, -57319,
1036         -56756, -56175, -55578, -54963, -54332, -53684, -53020, -52339, -51643, -50931,
1037         -50203, -49461, -48703, -47930, -47143, -46341, -45525, -44695, -43852, -42995,
1038         -42126, -41243, -40348, -39441, -38521, -37590, -36647, -35693, -34729, -33754,
1039         -32768, -31772, -30767, -29753, -28729, -27697, -26656, -25607, -24550, -23486,
1040         -22415, -21336, -20252, -19161, -18064, -16962, -15855, -14742, -13626, -12505,
1041         -11380, -10252,  -9121,  -7987,  -6850,  -5712,  -4572,  -3430,  -2287,  -1144,
1042         0,   1144,   2287,   3430,   4572,   5712,   6850,   7987,   9121,  10252,
1043         11380,  12505,  13626,  14742,  15855,  16962,  18064,  19161,  20252,  21336,
1044         22415,  23486,  24550,  25607,  26656,  27697,  28729,  29753,  30767,  31772,
1045         32768,  33754,  34729,  35693,  36647,  37590,  38521,  39441,  40348,  41243,
1046         42126,  42995,  43852,  44695,  45525,  46341,  47143,  47930,  48703,  49461,
1047         50203,  50931,  51643,  52339,  53020,  53684,  54332,  54963,  55578,  56175,
1048         56756,  57319,  57865,  58393,  58903,  59396,  59870,  60326,  60764,  61183,
1049         61584,  61966,  62328,  62672,  62997,  63303,  63589,  63856,  64104,  64332,
1050         64540,  64729,  64898,  65048,  65177,  65287,  65376,  65446,  65496,  65526
1051     };
1052     memcpy(sina_table, sinaTable, sizeof(sina_table));
1053     memcpy(cosa_table, cosaTable, sizeof(cosa_table));
1054     return 0;
1055 }
1056 
NormalRgaLogOutRgaReq(struct rga_req rgaReg)1057 void NormalRgaLogOutRgaReq(struct rga_req rgaReg) {
1058     ALOGE("render_mode = %d rotate_mode = %d in_fence_fd = %d handle_flag = 0x%x",
1059           rgaReg.render_mode, rgaReg.rotate_mode, rgaReg.in_fence_fd, rgaReg.handle_flag);
1060     ALOGE("src:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1061           (unsigned long)rgaReg.src.yrgb_addr, (unsigned long)rgaReg.src.uv_addr, (unsigned long)rgaReg.src.v_addr,
1062           rgaReg.src.x_offset, rgaReg.src.y_offset,
1063           rgaReg.src.act_w, rgaReg.src.act_h,
1064           rgaReg.src.vir_w, rgaReg.src.vir_h, rgaReg.src.format, rgaReg.src.rd_mode);
1065     ALOGE("dst:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1066           (unsigned long)rgaReg.dst.yrgb_addr, (unsigned long)rgaReg.dst.uv_addr, (unsigned long)rgaReg.dst.v_addr,
1067           rgaReg.dst.x_offset, rgaReg.dst.y_offset,
1068           rgaReg.dst.act_w, rgaReg.dst.act_h,
1069           rgaReg.dst.vir_w, rgaReg.dst.vir_h, rgaReg.dst.format, rgaReg.dst.rd_mode);
1070     ALOGE("pat:[%lx,%lx,%lx],x-y[%d,%d],w-h[%d,%d],vw-vh[%d,%d],f=%d, rd_mode = %d",
1071           (unsigned long)rgaReg.pat.yrgb_addr, (unsigned long)rgaReg.pat.uv_addr, (unsigned long)rgaReg.pat.v_addr,
1072           rgaReg.pat.x_offset, rgaReg.pat.y_offset,
1073           rgaReg.pat.act_w, rgaReg.pat.act_h,
1074           rgaReg.pat.vir_w, rgaReg.pat.vir_h, rgaReg.pat.format, rgaReg.pat.rd_mode);
1075     ALOGE("ROP:[%lx,%x,%x],LUT[%lx]", (unsigned long)rgaReg.rop_mask_addr, rgaReg.alpha_rop_flag,
1076           rgaReg.rop_code, (unsigned long)rgaReg.LUT_addr);
1077 
1078     ALOGE("color:[%x,%x,%x,%x,%x]", rgaReg.color_key_max, rgaReg.color_key_min,
1079           rgaReg.fg_color, rgaReg.bg_color, rgaReg.color_fill_mode);
1080 
1081     ALOGE("MMU:[%d,%lx,%x]", rgaReg.mmu_info.mmu_en,
1082           (unsigned long)rgaReg.mmu_info.base_addr, rgaReg.mmu_info.mmu_flag);
1083 
1084 
1085     ALOGE("mode[%d,%d,%d,%d,%d]", rgaReg.palette_mode, rgaReg.yuv2rgb_mode,
1086           rgaReg.endian_mode, rgaReg.src_trans_mode,rgaReg.scale_mode);
1087 
1088     ALOGE("Full CSC : EN[%d] FACTOR[%d, %d, %d, %d], [%d, %d, %d, %d], [%d, %d, %d, %d]",
1089           rgaReg.full_csc.flag,
1090           rgaReg.full_csc.coe_y.r_v, rgaReg.full_csc.coe_y.g_y, rgaReg.full_csc.coe_y.b_u, rgaReg.full_csc.coe_y.off,
1091           rgaReg.full_csc.coe_u.r_v, rgaReg.full_csc.coe_u.g_y, rgaReg.full_csc.coe_u.b_u, rgaReg.full_csc.coe_u.off,
1092           rgaReg.full_csc.coe_v.r_v, rgaReg.full_csc.coe_v.g_y, rgaReg.full_csc.coe_v.b_u, rgaReg.full_csc.coe_v.off);
1093 
1094     ALOGE("gr_color_x [%x, %x, %x]", rgaReg.gr_color.gr_x_r, rgaReg.gr_color.gr_x_g, rgaReg.gr_color.gr_x_b);
1095     ALOGE("gr_color_x [%x, %x, %x]", rgaReg.gr_color.gr_y_r, rgaReg.gr_color.gr_y_g, rgaReg.gr_color.gr_y_b);
1096 
1097     return;
1098 }
1099 
NormalRgaCompatModeConvertRga2ImgeInfo(rga2_img_info_t * info,rga_img_info_t * orig_info)1100 static inline void NormalRgaCompatModeConvertRga2ImgeInfo(rga2_img_info_t *info, rga_img_info_t *orig_info) {
1101     info->yrgb_addr = orig_info->yrgb_addr;
1102     info->uv_addr = orig_info->uv_addr;
1103     info->v_addr = orig_info->v_addr;
1104     info->format = orig_info->format;
1105     info->act_w = orig_info->act_w;
1106     info->act_h = orig_info->act_h;
1107     info->x_offset = orig_info->x_offset;
1108     info->y_offset = orig_info->y_offset;
1109     info->vir_w = orig_info->vir_w;
1110     info->vir_h = orig_info->vir_h;
1111     info->endian_mode = orig_info->endian_mode;
1112     info->alpha_swap = orig_info->alpha_swap;
1113 }
1114 
NormalRgaCompatModeConvertRga2Rect(rga2_rect_t * clip,RECT * orig_clip)1115 static inline void NormalRgaCompatModeConvertRga2Rect(rga2_rect_t *clip, RECT *orig_clip) {
1116     clip->xmax = orig_clip->xmax;
1117     clip->ymax = orig_clip->ymax;
1118     clip->xmin = orig_clip->xmin;
1119     clip->ymin = orig_clip->ymin;
1120 }
1121 
NormalRgaCompatModeConvertRga2ColorFill(rga2_color_fill_t * color,COLOR_FILL * orig_color)1122 static inline void NormalRgaCompatModeConvertRga2ColorFill(rga2_color_fill_t *color, COLOR_FILL *orig_color) {
1123     color->gr_x_a = orig_color->gr_x_a;
1124     color->gr_y_a = orig_color->gr_y_a;
1125     color->gr_x_b = orig_color->gr_x_b;
1126     color->gr_y_b = orig_color->gr_y_b;
1127     color->gr_x_g = orig_color->gr_x_g;
1128     color->gr_y_g = orig_color->gr_y_g;
1129     color->gr_x_r = orig_color->gr_x_r;
1130     color->gr_y_r = orig_color->gr_y_r;
1131 }
1132 
NormalRgaCompatModeConvertRga2LineDrawInfo(rga2_line_draw_t * info,line_draw_t * orig_info)1133 static inline void NormalRgaCompatModeConvertRga2LineDrawInfo(rga2_line_draw_t *info, line_draw_t *orig_info) {
1134     info->start_point.x = orig_info->start_point.x;
1135     info->start_point.y = orig_info->start_point.y;
1136     info->end_point.x = orig_info->end_point.x;
1137     info->end_point.y = orig_info->end_point.y;
1138     info->color = orig_info->color;
1139     info->flag = orig_info->flag;
1140     info->line_width = orig_info->line_width;
1141 }
1142 
NormalRgaCompatModeConvertRga2Fading(rga2_fading_t * fading,FADING * orig_fading)1143 static inline void NormalRgaCompatModeConvertRga2Fading(rga2_fading_t *fading, FADING *orig_fading) {
1144     fading->b = orig_fading->b;
1145     fading->g = orig_fading->g;
1146     fading->r = orig_fading->r;
1147     fading->res = orig_fading->res;
1148 }
1149 
NormalRgaCompatModeConvertRga2Mmu(rga2_mmu_t * mmu,MMU * orig_mmu)1150 static inline void NormalRgaCompatModeConvertRga2Mmu(rga2_mmu_t *mmu, MMU *orig_mmu) {
1151     mmu->mmu_en = orig_mmu->mmu_en;
1152 #if defined(__arm64__) || defined(__aarch64__)
1153     mmu->base_addr = (unsigned long)orig_mmu->base_addr;
1154 #else
1155     mmu->base_addr = (unsigned int)orig_mmu->base_addr;
1156 #endif
1157     mmu->mmu_flag = orig_mmu->mmu_flag;
1158 }
1159 
NormalRgaCompatModeConvertRga2FullCscCoe(rga2_csc_coe_t * coe,csc_coe_t * orig_coe)1160 static inline void NormalRgaCompatModeConvertRga2FullCscCoe(rga2_csc_coe_t *coe, csc_coe_t *orig_coe) {
1161     coe->r_v = orig_coe->r_v;
1162     coe->g_y = orig_coe->g_y;
1163     coe->b_u = orig_coe->b_u;
1164     coe->off = orig_coe->off;
1165 }
1166 
NormalRgaCompatModeConvertRga2FullCsc(rga2_full_csc_t * csc,full_csc_t * orig_csc)1167 static inline void NormalRgaCompatModeConvertRga2FullCsc(rga2_full_csc_t *csc, full_csc_t *orig_csc) {
1168     csc->flag = orig_csc->flag;
1169 
1170     NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_y, &orig_csc->coe_y);
1171     NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_u, &orig_csc->coe_u);
1172     NormalRgaCompatModeConvertRga2FullCscCoe(&csc->coe_v, &orig_csc->coe_v);
1173 }
1174 
NormalRgaCompatModeConvertRga2(rga2_req * req,rga_req * orig_req)1175 void NormalRgaCompatModeConvertRga2(rga2_req *req, rga_req *orig_req) {
1176     req->render_mode = orig_req->render_mode;
1177 
1178     NormalRgaCompatModeConvertRga2ImgeInfo(&req->src, &orig_req->src);
1179     NormalRgaCompatModeConvertRga2ImgeInfo(&req->dst, &orig_req->dst);
1180     NormalRgaCompatModeConvertRga2ImgeInfo(&req->pat, &orig_req->pat);
1181 
1182 #if defined(__arm64__) || defined(__aarch64__)
1183     req->rop_mask_addr = (unsigned long)orig_req->rop_mask_addr;
1184     req->LUT_addr = (unsigned long)orig_req->LUT_addr;
1185 #else
1186     req->rop_mask_addr = (unsigned int)orig_req->rop_mask_addr;
1187     req->LUT_addr = (unsigned int)orig_req->LUT_addr;
1188 #endif
1189 
1190     NormalRgaCompatModeConvertRga2Rect(&req->clip, &orig_req->clip);
1191 
1192     req->sina = orig_req->sina;
1193     req->cosa = orig_req->cosa;
1194     req->alpha_rop_flag = orig_req->alpha_rop_flag;
1195     req->scale_mode = orig_req->scale_mode;
1196     req->color_key_max = orig_req->color_key_max;
1197     req->color_key_min = orig_req->color_key_min;
1198     req->fg_color = orig_req->fg_color;
1199     req->bg_color = orig_req->bg_color;
1200 
1201     NormalRgaCompatModeConvertRga2ColorFill(&req->gr_color, &orig_req->gr_color);
1202     NormalRgaCompatModeConvertRga2LineDrawInfo(&req->line_draw_info, &orig_req->line_draw_info);
1203     NormalRgaCompatModeConvertRga2Fading(&req->fading, &orig_req->fading);
1204 
1205     req->PD_mode = orig_req->PD_mode;
1206     req->alpha_global_value = orig_req->alpha_global_value;
1207     req->rop_code = orig_req->rop_code;
1208     req->bsfilter_flag = orig_req->bsfilter_flag;
1209     req->palette_mode = orig_req->palette_mode;
1210     req->yuv2rgb_mode = orig_req->yuv2rgb_mode;
1211     req->endian_mode = orig_req->endian_mode;
1212     req->rotate_mode = orig_req->rotate_mode;
1213     req->color_fill_mode = orig_req->color_fill_mode;
1214 
1215     NormalRgaCompatModeConvertRga2Mmu(&req->mmu_info, &orig_req->mmu_info);
1216 
1217     req->alpha_rop_mode = orig_req->alpha_rop_mode;
1218     req->src_trans_mode = orig_req->src_trans_mode;
1219     req->dither_mode = orig_req->dither_mode;
1220 
1221     NormalRgaCompatModeConvertRga2FullCsc(&req->full_csc, &orig_req->full_csc);
1222 
1223     /* multi_rga moved this part of the processing to the driver. */
1224     if (req->sina == 65536 && req->cosa == 0) {
1225         /* rotate 90 */
1226         req->dst.x_offset = req->dst.x_offset + req->dst.act_h - 1;
1227     } else if (req->sina == 0 && req->cosa == -65536) {
1228         /* rotate 180 */
1229         req->dst.x_offset = req->dst.x_offset + req->dst.act_w - 1;
1230         req->dst.y_offset = req->dst.y_offset + req->dst.act_h - 1;
1231     } else if (req->sina == -65536 && req->cosa == 0) {
1232         /* totate 270 */
1233         req->dst.y_offset = req->dst.y_offset + req->dst.act_w - 1;
1234     }
1235 }
1236