drm/rockchip: vop2: add more sdr2hdr scene

maybe appear the following scene for sdr2hdr:
1. one sdr layer      -> vop[sdr2hdr]   -> hdr output
2. one hdr layer      -> vop[bypass]  |
                                      | -> hdr output
   one/more sdr layer -> vop[sdr2hdr] |

Signed-off-by: Sandy Huang <hjc@rock-chips.com>
Change-Id: I042baf68d36f6f9a089d81928c783e52a2b21499
This commit is contained in:
Sandy Huang
2021-06-02 15:10:06 +08:00
committed by Tao Huang
parent c6ce255dd0
commit 916008d27e

View File

@@ -4385,6 +4385,9 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
bool sdr2hdr_tf = 0;
bool hdr2sdr_tf_update = 1;
bool sdr2hdr_tf_update = 1;
unsigned long win_mask = vp->win_mask;
int phys_id;
bool have_sdr_layer = false;
/*
* Check whether this video port support hdr or not
@@ -4410,14 +4413,28 @@ static void vop2_setup_hdr10(struct vop2_video_port *vp, uint8_t win_phys_id)
*/
if (vp->hdr_in && !vp->hdr_out)
hdr2sdr_en = 1;
if (!vp->hdr_in && vp->hdr_out)
sdr2hdr_en = 1;
vp->sdr2hdr_en = sdr2hdr_en;
vpstate->hdr_in = hdr_en;
vpstate->hdr2sdr_en = hdr2sdr_en;
/*
* To confirm whether need to enable sdr2hdr.
*/
for_each_set_bit(phys_id, &win_mask, ROCKCHIP_MAX_LAYER) {
win = vop2_find_win_by_phys_id(vop2, phys_id);
plane = &win->base;
pstate = plane->state;
vpstate = to_vop2_plane_state(pstate);
if (vpstate->eotf != SMPTE_ST2084) {
have_sdr_layer = true;
break;
}
}
if (have_sdr_layer && vp->hdr_out)
sdr2hdr_en = 1;
vp->sdr2hdr_en = sdr2hdr_en;
if (sdr2hdr_en) {
sdr2hdr_r2r_mode = BT709_TO_BT2020;
if (vp->hdr_out)
@@ -4945,8 +4962,8 @@ static void vop2_crtc_atomic_begin(struct drm_crtc *crtc, struct drm_crtc_state
sort(vop2_zpos, nr_layers, sizeof(vop2_zpos[0]), vop2_zpos_cmp, NULL);
vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id);
vop2_setup_layer_mixer_for_vp(vp, vop2_zpos);
vop2_setup_hdr10(vp, vop2_zpos[0].win_phys_id);
vop2_setup_alpha(vp, vop2_zpos);
vop2_setup_dly_for_vp(vp);
vop2_setup_dly_for_window(vp, vop2_zpos);