diff --git a/drivers/video/rockchip/rga3/include/rga.h b/drivers/video/rockchip/rga3/include/rga.h index 21aa72d373e7..8415c7555477 100644 --- a/drivers/video/rockchip/rga3/include/rga.h +++ b/drivers/video/rockchip/rga3/include/rga.h @@ -612,7 +612,7 @@ struct rga_req { /* porter duff alpha mode sel */ uint8_t PD_mode; - /* global alpha value */ + /* legacy: global alpha value */ uint8_t alpha_global_value; /* rop2/3/4 code scan from rop code table*/ @@ -674,7 +674,11 @@ struct rga_req { struct rga_pre_intr_info pre_intr_info; - uint8_t reservr[59]; + /* global alpha */ + uint8_t fg_global_alpha; + uint8_t bg_global_alpha; + + uint8_t reservr[57]; }; struct rga_alpha_config { diff --git a/drivers/video/rockchip/rga3/rga2_reg_info.c b/drivers/video/rockchip/rga3/rga2_reg_info.c index c987919cfff3..aa3ff9e44037 100644 --- a/drivers/video/rockchip/rga3/rga2_reg_info.c +++ b/drivers/video/rockchip/rga3/rga2_reg_info.c @@ -2087,11 +2087,21 @@ static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler, req->alpha_config.bg_pixel_alpha_en = rga_is_alpha_format(req->dst.format); - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = false; + if (req_rga->fg_global_alpha < 0xff) { + req->alpha_config.fg_global_alpha_en = true; + req->alpha_config.fg_global_alpha_value = req_rga->fg_global_alpha; + } else if (!req->alpha_config.fg_pixel_alpha_en) { + req->alpha_config.fg_global_alpha_en = true; + req->alpha_config.fg_global_alpha_value = 0xff; + } - req->alpha_config.fg_global_alpha_value = req_rga->alpha_global_value; - req->alpha_config.bg_global_alpha_value = req_rga->alpha_global_value; + if (req_rga->bg_global_alpha < 0xff) { + req->alpha_config.bg_global_alpha_en = true; + req->alpha_config.bg_global_alpha_value = req_rga->bg_global_alpha; + } else if (!req->alpha_config.bg_pixel_alpha_en) { + req->alpha_config.bg_global_alpha_en = true; + req->alpha_config.bg_global_alpha_value = 0xff; + } /* porter duff alpha enable */ switch (req_rga->PD_mode) { @@ -2105,20 +2115,6 @@ static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler, req->alpha_config.mode = RGA_ALPHA_BLEND_DST; break; case 3: - if ((req_rga->alpha_rop_mode & 3) == 0) { - /* both use globalAlpha. */ - req->alpha_config.fg_global_alpha_en = true; - req->alpha_config.bg_global_alpha_en = true; - } else if ((req_rga->alpha_rop_mode & 3) == 1) { - /* Do not use globalAlpha. */ - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = false; - } else { - /* dst use globalAlpha */ - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = true; - } - req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_OVER; break; case 4: diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index b1d0f6b9ff69..69eab8b6606c 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -1070,7 +1070,7 @@ static void RGA3_set_reg_overlap_info(u8 *base, struct rga3_req *msg) bottom_color_ctrl.bits.alpha_cal_mode = RGA_ALPHA_SATURATION; top_color_ctrl.bits.global_alpha = config->fg_global_alpha_value; - bottom_color_ctrl.bits.global_alpha = config->fg_global_alpha_value; + bottom_color_ctrl.bits.global_alpha = config->bg_global_alpha_value; /* porter duff alpha enable */ switch (config->mode) { @@ -1643,11 +1643,21 @@ static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) req->alpha_config.fg_pixel_alpha_en = rga_is_alpha_format(req->win1.format); req->alpha_config.bg_pixel_alpha_en = rga_is_alpha_format(req->win0.format); - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = false; + if (req_rga->fg_global_alpha < 0xff) { + req->alpha_config.fg_global_alpha_en = true; + req->alpha_config.fg_global_alpha_value = req_rga->fg_global_alpha; + } else if (!req->alpha_config.fg_pixel_alpha_en) { + req->alpha_config.fg_global_alpha_en = true; + req->alpha_config.fg_global_alpha_value = 0xff; + } - req->alpha_config.fg_global_alpha_value = req_rga->alpha_global_value; - req->alpha_config.bg_global_alpha_value = req_rga->alpha_global_value; + if (req_rga->bg_global_alpha < 0xff) { + req->alpha_config.bg_global_alpha_en = true; + req->alpha_config.bg_global_alpha_value = req_rga->bg_global_alpha; + } else if (!req->alpha_config.bg_pixel_alpha_en) { + req->alpha_config.bg_global_alpha_en = true; + req->alpha_config.bg_global_alpha_value = 0xff; + } /* porter duff alpha enable */ switch (req_rga->PD_mode) { @@ -1661,20 +1671,6 @@ static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) req->alpha_config.mode = RGA_ALPHA_BLEND_DST; break; case 3: - if ((req_rga->alpha_rop_mode & 3) == 0) { - /* both use globalAlpha. */ - req->alpha_config.fg_global_alpha_en = true; - req->alpha_config.bg_global_alpha_en = true; - } else if ((req_rga->alpha_rop_mode & 3) == 1) { - /* Do not use globalAlpha. */ - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = false; - } else { - /* dst use globalAlpha */ - req->alpha_config.fg_global_alpha_en = false; - req->alpha_config.bg_global_alpha_en = true; - } - req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_OVER; break; case 4: