Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc7c653a authored by Qiwei Liu's avatar Qiwei Liu Committed by Chinmay Sawarkar
Browse files

msm: vidc: optimize encoder ftb cache ops



Store the fbd filled length of each output buffer.
When doing cache invalidate for ftb, use the stored
length in previous fbd of the same buffer, instead of
using the buffer alloc size.

CRs-Fixed: 2406814
Change-Id: I6fd113f8c7d99f5ef885fbf773e427cf48b56095
Signed-off-by: default avatarQiwei Liu <qiweil@codeaurora.org>
parent 642059a3
Loading
Loading
Loading
Loading
+67 −1
Original line number Original line Diff line number Diff line
@@ -2582,6 +2582,10 @@ static void handle_fbd(enum hal_command_response cmd, void *data)
		msm_comm_store_mark_data(&inst->fbd_data, vb->index,
		msm_comm_store_mark_data(&inst->fbd_data, vb->index,
			fill_buf_done->mark_data, fill_buf_done->mark_target);
			fill_buf_done->mark_data, fill_buf_done->mark_target);
	}
	}
	if (inst->session_type == MSM_VIDC_ENCODER) {
		msm_comm_store_filled_length(&inst->fbd_data, vb->index,
			fill_buf_done->filled_len1);
	}


	extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes);
	extra_idx = EXTRADATA_IDX(inst->bufq[CAPTURE_PORT].num_planes);
	if (extra_idx && extra_idx < VIDEO_MAX_PLANES)
	if (extra_idx && extra_idx < VIDEO_MAX_PLANES)
@@ -6056,9 +6060,14 @@ int msm_comm_qbuf_cache_operations(struct msm_vidc_inst *inst,
			} else if (vb->type ==
			} else if (vb->type ==
					V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
					V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
				if (!i) { /* bitstream */
				if (!i) { /* bitstream */
					u32 size_u32;
					skip = false;
					skip = false;
					offset = 0;
					offset = 0;
					size = vb->planes[i].length;
					size_u32 = vb->planes[i].length;
					msm_comm_fetch_filled_length(
						&inst->fbd_data, vb->index,
						&size_u32);
					size = size_u32;
					cache_op = SMEM_CACHE_INVALIDATE;
					cache_op = SMEM_CACHE_INVALIDATE;
				}
				}
			}
			}
@@ -6520,6 +6529,63 @@ bool kref_get_mbuf(struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf)
	return ret;
	return ret;
}
}


void msm_comm_store_filled_length(struct msm_vidc_list *data_list,
		u32 index, u32 filled_length)
{
	struct msm_vidc_buf_data *pdata = NULL;
	bool found = false;

	if (!data_list) {
		dprintk(VIDC_ERR, "%s: invalid params %pK\n",
			__func__, data_list);
		return;
	}

	mutex_lock(&data_list->lock);
	list_for_each_entry(pdata, &data_list->list, list) {
		if (pdata->index == index) {
			pdata->filled_length = filled_length;
			found = true;
			break;
		}
	}

	if (!found) {
		pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
		if (!pdata)  {
			dprintk(VIDC_WARN, "%s: malloc failure.\n", __func__);
			goto exit;
		}
		pdata->index = index;
		pdata->filled_length = filled_length;
		list_add_tail(&pdata->list, &data_list->list);
	}

exit:
	mutex_unlock(&data_list->lock);
}

void msm_comm_fetch_filled_length(struct msm_vidc_list *data_list,
		u32 index, u32 *filled_length)
{
	struct msm_vidc_buf_data *pdata = NULL;

	if (!data_list || !filled_length) {
		dprintk(VIDC_ERR, "%s: invalid params %pK %pK\n",
			__func__, data_list, filled_length);
		return;
	}

	mutex_lock(&data_list->lock);
	list_for_each_entry(pdata, &data_list->list, list) {
		if (pdata->index == index) {
			*filled_length = pdata->filled_length;
			break;
		}
	}
	mutex_unlock(&data_list->lock);
}

void msm_comm_store_mark_data(struct msm_vidc_list *data_list,
void msm_comm_store_mark_data(struct msm_vidc_list *data_list,
		u32 index, u32 mark_data, u32 mark_target)
		u32 index, u32 mark_data, u32 mark_target)
{
{
+4 −0
Original line number Original line Diff line number Diff line
@@ -252,6 +252,10 @@ void print_v4l2_buffer(u32 tag, const char *str, struct msm_vidc_inst *inst,
		struct v4l2_buffer *v4l2);
		struct v4l2_buffer *v4l2);
void kref_put_mbuf(struct msm_vidc_buffer *mbuf);
void kref_put_mbuf(struct msm_vidc_buffer *mbuf);
bool kref_get_mbuf(struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf);
bool kref_get_mbuf(struct msm_vidc_inst *inst, struct msm_vidc_buffer *mbuf);
void msm_comm_store_filled_length(struct msm_vidc_list *data_list,
		u32 index, u32 filled_length);
void msm_comm_fetch_filled_length(struct msm_vidc_list *data_list,
		u32 index, u32 *filled_length);
void msm_comm_store_mark_data(struct msm_vidc_list *data_list,
void msm_comm_store_mark_data(struct msm_vidc_list *data_list,
		u32 index, u32 mark_data, u32 mark_target);
		u32 index, u32 mark_data, u32 mark_target);
void msm_comm_fetch_mark_data(struct msm_vidc_list *data_list,
void msm_comm_fetch_mark_data(struct msm_vidc_list *data_list,
+1 −0
Original line number Original line Diff line number Diff line
@@ -187,6 +187,7 @@ struct msm_vidc_buf_data {
	u32 index;
	u32 index;
	u32 mark_data;
	u32 mark_data;
	u32 mark_target;
	u32 mark_target;
	u32 filled_length;
};
};


struct msm_vidc_common_data {
struct msm_vidc_common_data {