author | Pengcheng Chen <pengcheng.chen@amlogic.com> | 2017-10-16 02:09:17 (GMT) |
---|---|---|
committer | Pengcheng Chen <pengcheng.chen@amlogic.com> | 2017-10-18 08:57:33 (GMT) |
commit | de0e9713151e7c1b562c044a5602be2472b79116 (patch) | |
tree | 8bcbb8ec66424e79d65c12a882769edf4fc05858 | |
parent | 90980decf4bc690b5be7a4586e19454ac7ef8255 (diff) | |
download | system-de0e9713151e7c1b562c044a5602be2472b79116.zip system-de0e9713151e7c1b562c044a5602be2472b79116.tar.gz system-de0e9713151e7c1b562c044a5602be2472b79116.tar.bz2 |
ge2dlib: add ge2d global alpha control interface and test case [2/1]
PD#152357
add ge2d global alpha control interface and test case
Change-Id: I4fc9d1d146cb17740df42020fcb7e740d99d40c9
Signed-off-by: Pengcheng Chen <pengcheng.chen@amlogic.com>
-rw-r--r-- | libge2d/aml_ge2d.c | 2 | ||||
-rw-r--r-- | libge2d/ge2d_feature_test.c | 501 | ||||
-rw-r--r-- | libge2d/ge2d_port.c | 98 | ||||
-rw-r--r-- | libge2d/include/ge2d_port.h | 23 | ||||
-rw-r--r-- | libge2d/kernel-headers/linux/ge2d.h | 4 |
5 files changed, 535 insertions, 93 deletions
diff --git a/libge2d/aml_ge2d.c b/libge2d/aml_ge2d.c index 343e3cb..3031dab 100644 --- a/libge2d/aml_ge2d.c +++ b/libge2d/aml_ge2d.c @@ -242,7 +242,7 @@ exit: int aml_ge2d_process(aml_ge2d_info_t *pge2dinfo) { int ret = -1; - if (fd_ge2d > 0) + if (fd_ge2d >= 0) ret = ge2d_process(fd_ge2d,pge2dinfo); return ret; } diff --git a/libge2d/ge2d_feature_test.c b/libge2d/ge2d_feature_test.c index 0dac9b0..3fdd0bf 100644 --- a/libge2d/ge2d_feature_test.c +++ b/libge2d/ge2d_feature_test.c @@ -20,24 +20,28 @@ /* #define FILE_DATA */ -#define SRC1_FILE_NAME ("/system/bin/infocus.yuv") -#define SRC_FILE_NAME ("/system/bin/fb0.rgb32") -#define DST_FILE_NAME ("/system/bin/out1.rgb32") - -static int SX_SRC1 = 1920; -static int SY_SRC1 = 1080; -static int SX_SRC2 = 1920; -static int SY_SRC2 = 1080; -static int SX_DST = 1920; -static int SY_DST = 1080; +#define SRC1_FILE_NAME ("./fb1.raw") +#define SRC2_FILE_NAME ("./fb2.raw") +#define SRC_FILE_NAME ("./fb.raw") +#define DST_FILE_NAME ("./out1.rgb32") + +static int SX_SRC1 = 1280; +static int SY_SRC1 = 720; +static int SX_SRC2 = 1280; +static int SY_SRC2 = 720; +static int SX_DST = 1280; +static int SY_DST = 720; static int DEMOTIME = 3000; /* milliseconds */ static int SRC1_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; -static int SRC2_PIXFORMAT = PIXEL_FORMAT_YCrCb_420_SP; +static int SRC2_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; static int DST_PIXFORMAT = PIXEL_FORMAT_RGBA_8888; static int OP = AML_GE2D_STRETCHBLIT; - +static int src1_layer_mode = 0; +static int src2_layer_mode = 0; +static int gb1_alpha = 0xff; +static int gb2_alpha = 0xff; extern aml_ge2d_t amlge2d; static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo) @@ -58,7 +62,7 @@ static void set_ge2dinfo(aml_ge2d_info_t *pge2dinfo) pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; pge2dinfo->offset = 0; pge2dinfo->ge2d_op = OP; - pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED; + //pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED; } static void print_usage(void) @@ -85,6 +89,22 @@ static int parse_command_line(int argc, char *argv[]) sscanf (argv[i], "%d", &OP) == 1) { continue; } + else if (strcmp (argv[i] + 2, "bo1") == 0 && ++i < argc && + sscanf (argv[i], "%d", &src1_layer_mode) == 1) { + continue; + } + else if (strcmp (argv[i] + 2, "bo2") == 0 && ++i < argc && + sscanf (argv[i], "%d", &src2_layer_mode) == 1) { + continue; + } + else if (strcmp (argv[i] + 2, "gb1") == 0 && ++i < argc && + sscanf (argv[i], "%d", &gb1_alpha) == 1) { + continue; + } + else if (strcmp (argv[i] + 2, "gb2") == 0 && ++i < argc && + sscanf (argv[i], "%d", &gb2_alpha) == 1) { + continue; + } } } return ge2d_success; @@ -158,6 +178,7 @@ int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo) int fd = -1; int length = 0; int write_num = 0; + unsigned int *value; if (amlge2d.dst_size == 0) return 0; if ((GE2D_CANVAS_OSD0 == pge2dinfo->dst_info.memtype) @@ -177,7 +198,15 @@ int aml_write_file(const char* url , aml_ge2d_info_t *pge2dinfo) } memcpy(amlge2d.dst_data,pge2dinfo->dst_info.vaddr,amlge2d.dst_size); - + printf("pixel: 0x%2x, 0x%2x,0x%2x,0x%2x, 0x%2x,0x%2x,0x%2x,0x%2x\n", + amlge2d.dst_data[0], + amlge2d.dst_data[1], + amlge2d.dst_data[2], + amlge2d.dst_data[3], + amlge2d.dst_data[4], + amlge2d.dst_data[5], + amlge2d.dst_data[6], + amlge2d.dst_data[7]); write_num = write(fd,amlge2d.dst_data,amlge2d.dst_size); if (write_num <= 0) { E_GE2D("read file read_num=%d error\n",write_num); @@ -191,6 +220,13 @@ static int do_fill_rectangle(aml_ge2d_info_t *pge2dinfo) { int ret = -1; char code; + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + printf("do_fill_rectangle test case:\n"); pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; pge2dinfo->dst_info.memtype = GE2D_CANVAS_OSD0; @@ -236,53 +272,400 @@ static int do_blend(aml_ge2d_info_t *pge2dinfo) { int ret = -1; char code = 0; + int shared_fd_bakup; + unsigned long offset_bakup = 0; + printf("do_blend test case:\n"); + pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; pge2dinfo->src_info[1].memtype = GE2D_CANVAS_ALLOC; pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; - pge2dinfo->src_info[0].canvas_w = SX_SRC1; - pge2dinfo->src_info[0].canvas_h = SY_SRC1; - pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; - pge2dinfo->src_info[1].canvas_w = SX_SRC2; - pge2dinfo->src_info[1].canvas_h = SY_SRC2; - pge2dinfo->src_info[1].format = SRC2_PIXFORMAT; - pge2dinfo->dst_info.canvas_w = SX_DST; - pge2dinfo->dst_info.canvas_h = SY_DST; - pge2dinfo->dst_info.format = DST_PIXFORMAT; - - pge2dinfo->src_info[0].rect.x = 0; - pge2dinfo->src_info[0].rect.y = 0; - pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; - pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; - pge2dinfo->src_info[1].rect.x = 0; - pge2dinfo->src_info[1].rect.y = 0; - pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w; - pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h; - pge2dinfo->dst_info.rect.x = 0; - pge2dinfo->dst_info.rect.y = 0; - pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; - pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; - pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; - ret = aml_ge2d_process(pge2dinfo); - - sleep(5); - printf("please enter any key do rotation test[90]\n"); - code = getc(stdin); - pge2dinfo->dst_info.rotation = GE2D_ROTATION_90; - pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w/2; - pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h/2; - ret = aml_ge2d_process(pge2dinfo); + if (((gb1_alpha != 0xff) + && (gb2_alpha != 0xff))){ + printf("two steps blend,two plane alpha\n"); + + if (src2_layer_mode == LAYER_MODE_COVERAGE) { + printf("two steps blend,src2 LAYER_MODE_COVERAGE\n"); + ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + + /* both plane alpha, do 2 steps */ + /* step 1: strechbilt */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + /* src2 do strechbilt to dst */ + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = SX_DST; + pge2dinfo->src_info[1].canvas_h = SY_DST; + pge2dinfo->src_info[1].format = DST_PIXFORMAT; + pge2dinfo->src_info[1].rect.x = 0; + pge2dinfo->src_info[1].rect.y = 0; + pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[1].fill_color_en = 1; + pge2dinfo->src_info[1].def_color = 0x00; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE; + pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE; + pge2dinfo->src_info[0].plane_alpha = gb2_alpha; + pge2dinfo->src_info[1].plane_alpha = 0xff; + ret = aml_ge2d_process(pge2dinfo); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + + /* step2: blend src1 blend src2(dst) to dst */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w; + pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h; + pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format; + pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x; + pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y; + pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h; + pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd; + pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset; + pge2dinfo->src_info[1].fill_color_en = 0; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[1].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + pge2dinfo->src_info[1].plane_alpha = gb2_alpha; + ret = aml_ge2d_process(pge2dinfo); + } else { + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + printf("two step: strechbilt+blend\n"); + /* both plane alpha, do 2 steps */ + /* step 1: strechbilt */ + pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT; + /* src2 do strechbilt to dst */ + pge2dinfo->src_info[0].canvas_w = SX_SRC2; + pge2dinfo->src_info[0].canvas_h = SY_SRC2; + pge2dinfo->src_info[0].format = SRC2_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + + shared_fd_bakup = pge2dinfo->src_info[0].shared_fd; + offset_bakup = pge2dinfo->src_info[0].offset; + pge2dinfo->src_info[0].shared_fd = pge2dinfo->src_info[1].shared_fd; + pge2dinfo->src_info[0].offset = pge2dinfo->src_info[1].offset; + + pge2dinfo->src_info[0].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb2_alpha; + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + ret = aml_ge2d_process(pge2dinfo); + + /* step2: blend src1 blend src2(dst) to dst */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].shared_fd = shared_fd_bakup; + pge2dinfo->src_info[0].offset = offset_bakup; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w; + pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h; + pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format; + pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x; + pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y; + pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h; + pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd; + pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset; + pge2dinfo->src_info[1].fill_color_en = 0; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[1].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + pge2dinfo->src_info[1].plane_alpha = gb2_alpha; + ret = aml_ge2d_process(pge2dinfo); + } + } else if (src2_layer_mode == LAYER_MODE_COVERAGE){ + printf("two steps blend,src2 LAYER_MODE_COVERAGE: two blend\n"); + ret = aml_read_file_src1(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + /* both plane alpha, do 2 steps */ + /* step 1: strechbilt */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + /* src2 do strechbilt to dst */ + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = SX_DST; + pge2dinfo->src_info[1].canvas_h = SY_DST; + pge2dinfo->src_info[1].format = DST_PIXFORMAT; + pge2dinfo->src_info[1].rect.x = 0; + pge2dinfo->src_info[1].rect.y = 0; + pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[1].fill_color_en = 1; + pge2dinfo->src_info[1].def_color = 0x00; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = LAYER_MODE_COVERAGE; + pge2dinfo->src_info[1].layer_mode = LAYER_MODE_COVERAGE; + pge2dinfo->src_info[0].plane_alpha = gb2_alpha; + pge2dinfo->src_info[1].plane_alpha = 0xff; + ret = aml_ge2d_process(pge2dinfo); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + /* step2: blend src1 blend src2(dst) to dst */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w; + pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h; + pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format; + pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x; + pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y; + pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h; + pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd; + pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset; + pge2dinfo->src_info[1].fill_color_en = 0; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[1].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + pge2dinfo->src_info[1].plane_alpha = gb2_alpha; + ret = aml_ge2d_process(pge2dinfo); + } else if ((src2_layer_mode == LAYER_MODE_NON) + && (src1_layer_mode != LAYER_MODE_PREMULTIPLIED)){ + printf("two steps blend,src2 LAYER_MODE_NON:strechbilt+blend\n"); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + /* both plane alpha, do 2 steps */ + /* step 1: strechbilt */ + pge2dinfo->ge2d_op = AML_GE2D_STRETCHBLIT; + /* src2 do strechbilt to dst */ + pge2dinfo->src_info[0].canvas_w = SX_SRC2; + pge2dinfo->src_info[0].canvas_h = SY_SRC2; + pge2dinfo->src_info[0].format = SRC2_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + + shared_fd_bakup = pge2dinfo->src_info[0].shared_fd; + offset_bakup = pge2dinfo->src_info[0].offset; + pge2dinfo->src_info[0].shared_fd = pge2dinfo->src_info[1].shared_fd; + pge2dinfo->src_info[0].offset = pge2dinfo->src_info[1].offset; + pge2dinfo->src_info[0].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = 0xff; + pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + ret = aml_ge2d_process(pge2dinfo); + + /* step2: blend src1 blend src2(dst) to dst */ + pge2dinfo->ge2d_op = AML_GE2D_BLEND; + + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].shared_fd = shared_fd_bakup; + pge2dinfo->src_info[0].offset = offset_bakup; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = pge2dinfo->dst_info.canvas_w; + pge2dinfo->src_info[1].canvas_h = pge2dinfo->dst_info.canvas_h; + pge2dinfo->src_info[1].format = pge2dinfo->dst_info.format; + pge2dinfo->src_info[1].rect.x = pge2dinfo->dst_info.rect.x; + pge2dinfo->src_info[1].rect.y = pge2dinfo->dst_info.rect.y; + pge2dinfo->src_info[1].rect.w = pge2dinfo->dst_info.rect.w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->dst_info.rect.h; + pge2dinfo->src_info[1].shared_fd = pge2dinfo->dst_info.shared_fd; + pge2dinfo->src_info[1].offset = pge2dinfo->dst_info.offset; + pge2dinfo->src_info[1].fill_color_en = 0; + + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + printf("two steps blend,src1_layer_mode=%d,src2_layer_mode=%d\n",src1_layer_mode,src2_layer_mode); + + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[1].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + pge2dinfo->src_info[1].plane_alpha = gb2_alpha; + ret = aml_ge2d_process(pge2dinfo); + } else { + /* do blend src1 blend src2(dst) to dst */ + printf("one step blend\n"); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + pge2dinfo->src_info[0].canvas_w = SX_SRC1; + pge2dinfo->src_info[0].canvas_h = SY_SRC1; + pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; + pge2dinfo->src_info[0].rect.x = 0; + pge2dinfo->src_info[0].rect.y = 0; + pge2dinfo->src_info[0].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[0].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[0].fill_color_en = 0; + + pge2dinfo->src_info[1].canvas_w = SX_SRC2; + pge2dinfo->src_info[1].canvas_h = SY_SRC2; + pge2dinfo->src_info[1].format = SRC2_PIXFORMAT; + pge2dinfo->src_info[1].rect.x = 0; + pge2dinfo->src_info[1].rect.y = 0; + pge2dinfo->src_info[1].rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->src_info[1].rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->src_info[1].fill_color_en = 0; + if (src2_layer_mode == LAYER_MODE_NON) + pge2dinfo->src_info[0].format = PIXEL_FORMAT_RGBX_8888; + pge2dinfo->dst_info.canvas_w = SX_DST; + pge2dinfo->dst_info.canvas_h = SY_DST; + pge2dinfo->dst_info.format = DST_PIXFORMAT; + pge2dinfo->dst_info.rect.x = 0; + pge2dinfo->dst_info.rect.y = 0; + pge2dinfo->dst_info.rect.w = pge2dinfo->src_info[0].canvas_w; + pge2dinfo->dst_info.rect.h = pge2dinfo->src_info[0].canvas_h; + pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[1].layer_mode = src2_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + pge2dinfo->src_info[1].plane_alpha = gb2_alpha; + ret = aml_ge2d_process(pge2dinfo); + } return ret; } - static int do_strechblit(aml_ge2d_info_t *pge2dinfo) { int ret = -1; char code = 0; printf("do_strechblit test case:\n"); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; - pge2dinfo->dst_info.memtype = GE2D_CANVAS_OSD0; + pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; pge2dinfo->src_info[0].canvas_w = SX_SRC1; pge2dinfo->src_info[0].canvas_h = SY_SRC1; pge2dinfo->src_info[0].format = SRC1_PIXFORMAT; @@ -299,6 +682,9 @@ static int do_strechblit(aml_ge2d_info_t *pge2dinfo) pge2dinfo->dst_info.rect.w = SX_DST; pge2dinfo->dst_info.rect.h = SY_DST; pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + ret = aml_ge2d_process(pge2dinfo); sleep(5); @@ -316,6 +702,13 @@ static int do_blit(aml_ge2d_info_t *pge2dinfo) int ret = -1; char code = 0; printf("do_blit test case:\n"); + ret = aml_read_file_src1(SRC_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + ret = aml_read_file_src2(SRC1_FILE_NAME,pge2dinfo); + if (ret < 0) + return ge2d_fail; + pge2dinfo->src_info[0].memtype = GE2D_CANVAS_ALLOC; pge2dinfo->dst_info.memtype = GE2D_CANVAS_ALLOC; pge2dinfo->src_info[0].canvas_w = SX_SRC1; @@ -333,6 +726,9 @@ static int do_blit(aml_ge2d_info_t *pge2dinfo) pge2dinfo->dst_info.rect.y = 0; pge2dinfo->dst_info.rotation = GE2D_ROTATION_0; + pge2dinfo->src_info[0].layer_mode = src1_layer_mode; + pge2dinfo->src_info[0].plane_alpha = gb1_alpha; + ret = aml_ge2d_process(pge2dinfo); sleep(5); @@ -377,15 +773,6 @@ int main(int argc, char **argv) if (ret < 0) goto exit; - - ret = aml_read_file_src1(SRC_FILE_NAME,&ge2dinfo); - if (ret < 0) - goto exit; - - ret = aml_read_file_src2(SRC1_FILE_NAME,&ge2dinfo); - if (ret < 0) - goto exit; - switch (ge2dinfo.ge2d_op) { case AML_GE2D_FILLRECTANGLE: diff --git a/libge2d/ge2d_port.c b/libge2d/ge2d_port.c index cc97f9a..8cf5180 100644 --- a/libge2d/ge2d_port.c +++ b/libge2d/ge2d_port.c @@ -279,8 +279,8 @@ static int ge2d_fillrectangle_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) return ge2d_fail; } } - ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0x00; + ge2d_config_ex.alu_const_color = pge2dinfo->const_color; + ge2d_config_ex.src1_gb_alpha = input_buffer_info->plane_alpha & 0xff; ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { @@ -347,6 +347,12 @@ static int ge2d_blit_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) ge2d_config_ex.dst_para.top = 0; ge2d_config_ex.dst_para.width = d_canvas_w; ge2d_config_ex.dst_para.height = d_canvas_h; + if (input_buffer_info->layer_mode == LAYER_MODE_PREMULTIPLIED) + ge2d_config_ex.src1_cmult_asel = 2; + else if (input_buffer_info->layer_mode == LAYER_MODE_COVERAGE) + ge2d_config_ex.src1_cmult_asel = 0; + else if (input_buffer_info->layer_mode == LAYER_MODE_NON) + ge2d_config_ex.src1_cmult_asel = 0; switch (pge2dinfo->src_info[0].rotation) { case GE2D_ROTATION_0: @@ -488,8 +494,15 @@ static int ge2d_blit_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) } } - ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0x00; + ge2d_config_ex.alu_const_color = pge2dinfo->const_color; + ge2d_config_ex.src1_gb_alpha = input_buffer_info->plane_alpha & 0xff; + ge2d_config_ex.src1_gb_alpha_en = 1; + D_GE2D("bilt:src1_cmult_asel=%d,src2_cmult_ase2=%d,gl_alpha=%x,src1_gb_alpha_en=%d\n", + ge2d_config_ex.src1_cmult_asel, + ge2d_config_ex.src2_cmult_asel, + ge2d_config_ex.src1_gb_alpha, + ge2d_config_ex.src1_gb_alpha_en); + ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { E_GE2D("ge2d config ex ion failed. \n"); @@ -524,9 +537,21 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) b_src_swap = 1; D_GE2D("NOTE:src2 not support nv21/nv12, swap src1 and src2!\n"); } + else if ((input_buffer_info->plane_alpha == 0xff) && + (input2_buffer_info->plane_alpha != 0xff) && + (input_buffer_info->layer_mode != LAYER_MODE_NON) && + (input2_buffer_info->layer_mode == LAYER_MODE_PREMULTIPLIED)) { + /* swap src1 and src2 buffer to process plane alpha*/ + /* TODO: need check the src1 rect and src2 rect */ + input_buffer_info = &pge2dinfo->src_info[1]; + input2_buffer_info = &pge2dinfo->src_info[0]; + //pge2dinfo->gl_alpha &= SRC1_GB_ALPHA_ENABLE; + //pge2dinfo->gl_alpha |= (input_buffer_info->plane_alpha & 0xff); + b_src_swap = 1; + } else b_src_swap = 0; - + D_GE2D("b_src_swap=%d\n",b_src_swap); memset(&ge2d_config_ex, 0, sizeof(struct config_para_ex_ion_s )); if (CANVAS_ALLOC == input_buffer_info->memtype) { @@ -573,6 +598,15 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) ge2d_config_ex.src_para.top = input_buffer_info->rect.y; ge2d_config_ex.src_para.width = input_buffer_info->rect.w; ge2d_config_ex.src_para.height = input_buffer_info->rect.h; + ge2d_config_ex.src_para.color = input_buffer_info->def_color; + ge2d_config_ex.src_para.fill_color_en = input_buffer_info->fill_color_en; + + if (input_buffer_info->layer_mode == LAYER_MODE_PREMULTIPLIED) + ge2d_config_ex.src1_cmult_asel = 2; + else if (input_buffer_info->layer_mode == LAYER_MODE_COVERAGE) + ge2d_config_ex.src1_cmult_asel = 0; + else if (input_buffer_info->layer_mode == LAYER_MODE_NON) + ge2d_config_ex.src1_cmult_asel = 0; ge2d_config_ex.src2_para.mem_type = input2_buffer_info->memtype; ge2d_config_ex.src2_para.format = src2_format; @@ -580,6 +614,9 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) ge2d_config_ex.src2_para.top = input2_buffer_info->rect.y; ge2d_config_ex.src2_para.width = input2_buffer_info->rect.w; ge2d_config_ex.src2_para.height = input2_buffer_info->rect.h; + ge2d_config_ex.src2_para.color = input2_buffer_info->def_color; + ge2d_config_ex.src2_para.fill_color_en = input2_buffer_info->fill_color_en; + ge2d_config_ex.src2_cmult_asel = 0; ge2d_config_ex.dst_para.mem_type = output_buffer_info->memtype; ge2d_config_ex.dst_para.format = dst_format; @@ -797,8 +834,15 @@ static int ge2d_blend_config_ex_ion(int fd,aml_ge2d_info_t *pge2dinfo) return ge2d_fail; } } - ge2d_config_ex.alu_const_color = 0x00000000; - ge2d_config_ex.src1_gb_alpha = 0x00; + ge2d_config_ex.alu_const_color = pge2dinfo->const_color; + ge2d_config_ex.src1_gb_alpha = input_buffer_info->plane_alpha & 0xff; + ge2d_config_ex.src1_gb_alpha_en = 1; + + D_GE2D("blend:src1_cmult_asel=%d,src2_cmult_ase2=%d,gl_alpha=%x,src1_gb_alpha_en=%d\n", + ge2d_config_ex.src1_cmult_asel, + ge2d_config_ex.src2_cmult_asel, + ge2d_config_ex.src1_gb_alpha, + ge2d_config_ex.src1_gb_alpha_en); ret = ioctl(fd, GE2D_CONFIG_EX_ION, &ge2d_config_ex); if (ret < 0) { E_GE2D("ge2d config ex ion failed. \n"); @@ -956,6 +1000,7 @@ static int ge2d_blend(int fd,rectangle_t *srect,rectangle_t *srect2,rectangle_t srect->x,srect->y,srect->w,srect->h, srect2->x,srect2->y,srect2->w,srect2->h, drect->x,drect->y,drect->w,drect->h); + D_GE2D("ge2d_blend:blend_mode=%d\n",op); memset(&blend_op,0,sizeof(ge2d_blend_op)); max_d_w = (srect->w > srect2->w) ? srect2->w : srect->w; max_d_h = (srect->h > srect2->h) ? srect2->h : srect->h; @@ -988,35 +1033,35 @@ static int ge2d_blend(int fd,rectangle_t *srect,rectangle_t *srect2,rectangle_t if (b_src_swap) { blend_op.color_blending_src_factor = COLOR_FACTOR_ZERO; blend_op.color_blending_dst_factor = COLOR_FACTOR_ONE; - blend_op.alpha_blending_src_factor = COLOR_FACTOR_ZERO; - blend_op.alpha_blending_dst_factor = COLOR_FACTOR_ONE; + blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ZERO; + blend_op.alpha_blending_dst_factor = ALPHA_FACTOR_ONE; } else { blend_op.color_blending_src_factor = COLOR_FACTOR_ONE; blend_op.color_blending_dst_factor = COLOR_FACTOR_ZERO; - blend_op.alpha_blending_src_factor = COLOR_FACTOR_ONE; - blend_op.alpha_blending_dst_factor = COLOR_FACTOR_ZERO; + blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ONE; + blend_op.alpha_blending_dst_factor = ALPHA_FACTOR_ZERO; } break; case BLEND_MODE_PREMULTIPLIED: if (b_src_swap) { blend_op.color_blending_src_factor = COLOR_FACTOR_ONE_MINUS_DST_ALPHA; blend_op.color_blending_dst_factor = COLOR_FACTOR_ONE; - blend_op.alpha_blending_src_factor = COLOR_FACTOR_ONE_MINUS_DST_ALPHA; - blend_op.alpha_blending_dst_factor = COLOR_FACTOR_ONE; + blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ONE_MINUS_DST_ALPHA; + blend_op.alpha_blending_dst_factor = ALPHA_FACTOR_ONE; } else { blend_op.color_blending_src_factor = COLOR_FACTOR_ONE; blend_op.color_blending_dst_factor = COLOR_FACTOR_ONE_MINUS_SRC_ALPHA; - blend_op.alpha_blending_src_factor = COLOR_FACTOR_ONE; - blend_op.alpha_blending_dst_factor = COLOR_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ONE; + blend_op.alpha_blending_dst_factor = ALPHA_FACTOR_ONE_MINUS_SRC_ALPHA; } break; case BLEND_MODE_COVERAGE: if (b_src_swap) { blend_op.color_blending_src_factor = COLOR_FACTOR_ONE_MINUS_DST_ALPHA; - blend_op.color_blending_dst_factor = ALPHA_FACTOR_DST_ALPHA; - blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ONE_MINUS_SRC_ALPHA; + blend_op.color_blending_dst_factor = COLOR_FACTOR_DST_ALPHA; + blend_op.alpha_blending_src_factor = ALPHA_FACTOR_ONE_MINUS_DST_ALPHA; blend_op.alpha_blending_dst_factor = ALPHA_FACTOR_DST_ALPHA; } else { @@ -1054,11 +1099,11 @@ static int ge2d_blend_noalpha(int fd,rectangle_t *srect,rectangle_t *srect2,rect ge2d_op_para_t op_ge2d_info; ge2d_blend_op blend_op; int max_d_w, max_d_h; - D_GE2D("ge2d_blend srect[%d %d %d %d], s2rect[%d %d %d %d],drect[%d %d %d %d]\n", srect->x,srect->y,srect->w,srect->h, srect2->x,srect2->y,srect2->w,srect2->h, drect->x,drect->y,drect->w,drect->h); + D_GE2D("ge2d_blend_noalpha:blend_mode=%d\n",op); memset(&blend_op,0,sizeof(ge2d_blend_op)); max_d_w = (srect->w > srect2->w) ? srect2->w : srect->w; max_d_h = (srect->h > srect2->h) ? srect2->h : srect->h; @@ -1215,9 +1260,6 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) case AML_GE2D_STRETCHBLIT: if (!is_rect_valid(&pge2dinfo->src_info[0])) return ge2d_fail; - if (!is_rect_valid(&pge2dinfo->dst_info)) - return ge2d_fail; - dst_rect.w = pge2dinfo->dst_info.rect.w; dst_rect.h = pge2dinfo->dst_info.rect.h; dst_rect.x = pge2dinfo->dst_info.rect.x; @@ -1241,14 +1283,21 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) return ge2d_fail; if (!is_rect_valid(&pge2dinfo->dst_info)) return ge2d_fail; - + if (pge2dinfo->src_info[0].layer_mode == LAYER_MODE_PREMULTIPLIED) + pge2dinfo->blend_mode = BLEND_MODE_PREMULTIPLIED; + else if (pge2dinfo->src_info[0].layer_mode == LAYER_MODE_COVERAGE) + pge2dinfo->blend_mode = BLEND_MODE_COVERAGE; + else + pge2dinfo->blend_mode = BLEND_MODE_NONE; dst_rect.w = pge2dinfo->dst_info.rect.w; dst_rect.h = pge2dinfo->dst_info.rect.h; dst_rect.x = pge2dinfo->dst_info.rect.x; dst_rect.y = pge2dinfo->offset + pge2dinfo->dst_info.rect.y; ret = ge2d_blend_config_ex_ion(fd,pge2dinfo); if (ret == ge2d_success) { - if ((is_no_alpha(pge2dinfo->src_info[0].format)) || (is_no_alpha(pge2dinfo->src_info[1].format))) { + if ((is_no_alpha(pge2dinfo->src_info[0].format)) + || (is_no_alpha(pge2dinfo->src_info[1].format)) + || (pge2dinfo->src_info[0].layer_mode == LAYER_MODE_NON)) { if (b_src_swap) ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[1].rect), &(pge2dinfo->src_info[0].rect), @@ -1257,8 +1306,7 @@ int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo) ge2d_blend_noalpha(fd,&(pge2dinfo->src_info[0].rect), &(pge2dinfo->src_info[1].rect), &dst_rect,pge2dinfo->blend_mode); - } - else { + } else { if (b_src_swap) ge2d_blend(fd,&(pge2dinfo->src_info[1].rect), &(pge2dinfo->src_info[0].rect), diff --git a/libge2d/include/ge2d_port.h b/libge2d/include/ge2d_port.h index 74fff15..45d46bb 100644 --- a/libge2d/include/ge2d_port.h +++ b/libge2d/include/ge2d_port.h @@ -16,6 +16,7 @@ #define OSD0 0 #define OSD1 1 +#define SRC1_GB_ALPHA_ENABLE 0x80000000 #if defined (__cplusplus) extern "C" { @@ -28,6 +29,12 @@ typedef enum { GE2D_CANVAS_TYPE_INVALID, }ge2d_canvas_t; +typedef enum { + LAYER_MODE_INVALID = 0, + LAYER_MODE_NON = 1, + LAYER_MODE_PREMULTIPLIED = 2, + LAYER_MODE_COVERAGE = 3, +} layer_mode_t; /* Blend modes, settable per layer */ typedef enum { @@ -43,13 +50,9 @@ typedef enum { BLEND_MODE_COVERAGE = 3, } blend_mode_t; - - - /** * pixel format definitions */ - typedef enum { PIXEL_FORMAT_RGBA_8888 = 1, PIXEL_FORMAT_RGBX_8888 = 2, @@ -70,7 +73,6 @@ typedef enum { GE2D_ROTATION_270, } GE2D_ROTATION; - typedef enum { AML_GE2D_FILLRECTANGLE, AML_GE2D_BLEND, @@ -79,7 +81,6 @@ typedef enum { AML_GE2D_NONE, } GE2DOP; - typedef struct{ int x; int y; @@ -87,7 +88,6 @@ typedef struct{ int h; }rectangle_t; - typedef struct buffer_info { unsigned int memtype; char* vaddr; @@ -98,10 +98,12 @@ typedef struct buffer_info { int format; unsigned int rotation; int shared_fd; + unsigned char plane_alpha; + unsigned char layer_mode; + unsigned char fill_color_en; + unsigned int def_color; } buffer_info_t; - - typedef struct aml_ge2d_info { unsigned int offset; unsigned int blend_mode; @@ -110,9 +112,10 @@ typedef struct aml_ge2d_info { buffer_info_t dst_info; unsigned int color; unsigned int gl_alpha; + unsigned int const_color; + unsigned int reserved; } aml_ge2d_info_t; - int ge2d_open(void); int ge2d_close(int fd); int ge2d_process(int fd,aml_ge2d_info_t *pge2dinfo); diff --git a/libge2d/kernel-headers/linux/ge2d.h b/libge2d/kernel-headers/linux/ge2d.h index 845d6c3..532a1a4 100644 --- a/libge2d/kernel-headers/linux/ge2d.h +++ b/libge2d/kernel-headers/linux/ge2d.h @@ -183,7 +183,11 @@ struct config_para_ex_ion_s { struct src_key_ctrl_s src_key; struct src_key_ctrl_s src2_key; + unsigned char src1_cmult_asel; + unsigned char src2_cmult_asel; + int alu_const_color; + unsigned char src1_gb_alpha_en; unsigned src1_gb_alpha; unsigned op_mode; unsigned char bitmask_en; |