summaryrefslogtreecommitdiff
authorPengcheng 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)
commitde0e9713151e7c1b562c044a5602be2472b79116 (patch)
tree8bcbb8ec66424e79d65c12a882769edf4fc05858
parent90980decf4bc690b5be7a4586e19454ac7ef8255 (diff)
downloadsystem-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>
Diffstat
-rw-r--r--libge2d/aml_ge2d.c2
-rw-r--r--libge2d/ge2d_feature_test.c501
-rw-r--r--libge2d/ge2d_port.c98
-rw-r--r--libge2d/include/ge2d_port.h23
-rw-r--r--libge2d/kernel-headers/linux/ge2d.h4
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;