Эх сурвалжийг харах

video: driver: adjust opb buffers min count

Incase of split mode(either for linear color format
or AV1 film grain usecases), dpb and opb(output)
buffers are allocated in same context bank. In high
memory consumption usecases like 8k, it can lead to
OOM issues. To avoid this, for split mode, when both
dpb and opb buffers are used, honor fw min count for
dpb buffers, whereas for opb buffers choose an optimal
min count to ensure performance.

Change-Id: I287aff862d2fe36a690c1393d64f8095578baf34
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 2 жил өмнө
parent
commit
dd06676471

+ 12 - 13
driver/variant/iris33/src/msm_vidc_buffer_iris33.c

@@ -74,9 +74,11 @@ static u32 msm_vidc_decoder_comv_size_iris33(struct msm_vidc_inst *inst)
 		 * achieve performance but save memory.
 		 */
 		if (res_is_greater_than(width, height, 4096, 2176))
-			num_comv = inst->buffers.output.min_count + 3;
+			num_comv = inst->fw_min_count ?
+				inst->fw_min_count + 3 : inst->buffers.output.min_count + 3;
 		else
-			num_comv = inst->buffers.output.min_count + 7;
+			num_comv = inst->fw_min_count ?
+				inst->fw_min_count + 7 : inst->buffers.output.min_count + 7;
 	} else {
 		num_comv = inst->buffers.output.min_count;
 	}
@@ -624,21 +626,18 @@ static int msm_vidc_input_min_count_iris33(struct msm_vidc_inst *inst)
 static int msm_buffer_dpb_count(struct msm_vidc_inst *inst)
 {
 	int count = 0;
-	u32 color_fmt;
 
-	/* decoder dpb buffer count */
-	if (is_decode_session(inst)) {
-		color_fmt = inst->capabilities[PIX_FMTS].value;
-		if (is_linear_colorformat(color_fmt) ||
-			(inst->codec == MSM_VIDC_AV1 &&
-			(inst->capabilities[FILM_GRAIN].value)))
-			count = inst->buffers.output.min_count;
+	/* encoder dpb buffer count */
+	if (is_encode_session(inst))
+		return msm_vidc_get_recon_buf_count(inst);
 
-		return count;
+	/* decoder dpb buffer count */
+	if (is_split_mode_enabled(inst)) {
+		count = inst->fw_min_count ?
+			inst->fw_min_count : inst->buffers.output.min_count;
 	}
 
-	/* encoder dpb buffer count */
-	return msm_vidc_get_recon_buf_count(inst);
+	return count;
 }
 
 static int msm_buffer_delivery_mode_based_min_count_iris33(struct msm_vidc_inst *inst,

+ 13 - 0
driver/vidc/inc/msm_vidc_driver.h

@@ -320,6 +320,19 @@ static inline bool is_rgba_colorformat(enum msm_vidc_colorformat_type colorforma
 		colorformat == MSM_VIDC_FMT_RGBA8888C;
 }
 
+static inline bool is_split_mode_enabled(struct msm_vidc_inst *inst)
+{
+	if (!is_decode_session(inst))
+		return false;
+
+	if (is_linear_colorformat(inst->capabilities[PIX_FMTS].value) ||
+		(inst->codec == MSM_VIDC_AV1 &&
+		inst->capabilities[FILM_GRAIN].value))
+		return true;
+
+	return false;
+}
+
 static inline bool is_thumbnail_session(struct msm_vidc_inst *inst)
 {
 	return !!(inst->capabilities[THUMBNAIL_MODE].value);

+ 16 - 17
driver/vidc/src/msm_vdec.c

@@ -615,15 +615,12 @@ static int msm_vdec_set_av1_superblock_enabled(struct msm_vidc_inst *inst,
 static int msm_vdec_set_opb_enable(struct msm_vidc_inst *inst)
 {
 	int rc = 0;
-	u32 color_fmt;
 	u32 opb_enable = 0;
 
 	if (inst->codec != MSM_VIDC_AV1)
 		return 0;
 
-	color_fmt = inst->capabilities[PIX_FMTS].value;
-	if (is_linear_colorformat(color_fmt) ||
-		inst->capabilities[FILM_GRAIN].value)
+	if (is_split_mode_enabled(inst))
 		opb_enable = 1;
 
 	i_vpr_h(inst, "%s: OPB enable: %d",  __func__, opb_enable);
@@ -1355,19 +1352,6 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 	inst->fmts[INPUT_PORT].fmt.pix_mp.quantization =
 		inst->fmts[OUTPUT_PORT].fmt.pix_mp.quantization;
 
-	inst->buffers.output.min_count = subsc_params.fw_min_count;
-	inst->fw_min_count = subsc_params.fw_min_count;
-	inst->buffers.output.extra_count = call_session_op(core,
-		extra_count, inst, MSM_VIDC_BUF_OUTPUT);
-	inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
-	inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
-	if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
-		if (inst->buffers.output.min_count != 1) {
-			i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
-				__func__, inst->buffers.output.min_count);
-			msm_vidc_change_state(inst, MSM_VIDC_ERROR, __func__);
-		}
-	}
 	inst->crop.top = subsc_params.crop_offsets[0] & 0xFFFF;
 	inst->crop.left = (subsc_params.crop_offsets[0] >> 16) & 0xFFFF;
 	inst->crop.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height -
@@ -1402,6 +1386,21 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 			MSM_VIDC_META_DISABLE, __func__);
 	}
 
+	inst->fw_min_count = subsc_params.fw_min_count;
+	inst->buffers.output.min_count = call_session_op(core,
+		min_count, inst, MSM_VIDC_BUF_OUTPUT);
+	inst->buffers.output.extra_count = call_session_op(core,
+		extra_count, inst, MSM_VIDC_BUF_OUTPUT);
+	inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
+	inst->buffers.output_meta.extra_count = inst->buffers.output.extra_count;
+	if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
+		if (inst->buffers.output.min_count != 1) {
+			i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
+				__func__, inst->buffers.output.min_count);
+			msm_vidc_change_state(inst, MSM_VIDC_ERROR, __func__);
+		}
+	}
+
 	return 0;
 }
 

+ 36 - 22
driver/vidc/src/msm_vidc_buffer.c

@@ -54,30 +54,44 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
 	if (is_thumbnail_session(inst))
 		return 1;
 
-	if (is_decode_session(inst)) {
-		if (inst->fw_min_count)
+	if (is_encode_session(inst))
+		return MIN_ENC_OUTPUT_BUFFERS;
+
+	/* decoder handling below */
+	/* fw_min_count > 0 indicates reconfig event has already arrived */
+	if (inst->fw_min_count) {
+		/* TODO: need to update condition to include AVC/HEVC as well */
+		if (is_split_mode_enabled(inst) &&
+			(inst->codec == MSM_VIDC_AV1 ||
+			inst->codec == MSM_VIDC_VP9)) {
+			/*
+			 * return opb min buffer count as min(4, fw_min_count)
+			 * fw min count is used for dpb min count
+			 */
+			return min_t(u32, 4, inst->fw_min_count);
+		} else {
 			return inst->fw_min_count;
-
-		switch (inst->codec) {
-		case MSM_VIDC_H264:
-		case MSM_VIDC_HEVC:
-			output_min_count = 4;
-			break;
-		case MSM_VIDC_VP9:
-			output_min_count = 9;
-			break;
-		case MSM_VIDC_AV1:
-			output_min_count = 11;
-			break;
-		case MSM_VIDC_HEIC:
-			output_min_count = 3;
-			break;
-		default:
-			output_min_count = 4;
 		}
-	} else {
-		output_min_count = MIN_ENC_OUTPUT_BUFFERS;
-		//todo: reduce heic count to 2, once HAL side cushion is added
+	}
+
+	/* initial handling before reconfig event arrived */
+	switch (inst->codec) {
+	case MSM_VIDC_H264:
+	case MSM_VIDC_HEVC:
+		output_min_count = 4;
+		break;
+	case MSM_VIDC_VP9:
+		output_min_count = 9;
+		break;
+	case MSM_VIDC_AV1:
+		output_min_count = 11;
+		break;
+	case MSM_VIDC_HEIC:
+		output_min_count = 3;
+		break;
+	default:
+		output_min_count = 4;
+		break;
 	}
 
 	return output_min_count;