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