diff options
author | james qian wang (Arm Technology China) <james.qian.wang@arm.com> | 2019-06-12 11:20:18 +0100 |
---|---|---|
committer | Liviu Dudau <Liviu.Dudau@arm.com> | 2019-06-19 11:42:18 +0100 |
commit | 264b9436d23b065cb74d76dff49b4ffac2cee11e (patch) | |
tree | ca797a44938bf546e649845f0164584ac18529fc /drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c | |
parent | 4b9baf74ef732f611bbd267f7b8ffcfb163d667b (diff) |
drm/komeda: Enable writeback split support
Writeback split is also for workaround the size limitation of d71 scaler.
Like layer_split, writeback downscaling also can use two scalers to handle
the scaling half-by-half. The only differnence is writback needs a
standalone component (splitter)'s help to split the composition result.
The data pipeline of writeback split as below:
/-> scaler-0 ->\
compiz -> splitter merger -> wb_layer -> memory
\-> scaler-1 ->/
v2: Rebase
Signed-off-by: James Qian Wang (Arm Technology China) <james.qian.wang@arm.com>
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
Diffstat (limited to 'drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c')
-rw-r--r-- | drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c index 0d734244f662..bb8a61f6e9a4 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_wb_connector.c @@ -13,6 +13,7 @@ komeda_wb_init_data_flow(struct komeda_layer *wb_layer, struct komeda_crtc_state *kcrtc_st, struct komeda_data_flow_cfg *dflow) { + struct komeda_scaler *scaler = wb_layer->base.pipeline->scalers[0]; struct drm_framebuffer *fb = conn_st->writeback_job->fb; memset(dflow, 0, sizeof(*dflow)); @@ -29,6 +30,13 @@ komeda_wb_init_data_flow(struct komeda_layer *wb_layer, komeda_complete_data_flow_cfg(dflow, fb); + /* if scaling exceed the acceptable scaler input/output range, try to + * enable split. + */ + if (dflow->en_scaling && scaler) + dflow->en_split = !in_range(&scaler->hsize, dflow->in_w) || + !in_range(&scaler->hsize, dflow->out_w); + return 0; } @@ -66,7 +74,14 @@ komeda_wb_encoder_atomic_check(struct drm_encoder *encoder, if (err) return err; - return komeda_build_wb_data_flow(wb_layer, conn_st, kcrtc_st, &dflow); + if (dflow.en_split) + err = komeda_build_wb_split_data_flow(wb_layer, + conn_st, kcrtc_st, &dflow); + else + err = komeda_build_wb_data_flow(wb_layer, + conn_st, kcrtc_st, &dflow); + + return err; } static const struct drm_encoder_helper_funcs komeda_wb_encoder_helper_funcs = { |