[Libva] [libva-intel-driver PATCH 1/2] dec/hevc: Don't reallocate internal buffer if the buffer size is large enough
Xiang, Haihao
haihao.xiang at intel.com
Fri Jun 26 09:23:06 PDT 2015
Otherwise it might result in GPU hang
Signed-off-by: Xiang, Haihao <haihao.xiang at intel.com>
---
src/gen9_mfd.c | 69 ++++++++++++++++++++--------------------------------------
1 file changed, 23 insertions(+), 46 deletions(-)
diff --git a/src/gen9_mfd.c b/src/gen9_mfd.c
index 0c22ca5..a3fef85 100644
--- a/src/gen9_mfd.c
+++ b/src/gen9_mfd.c
@@ -99,6 +99,12 @@ gen9_hcpd_init_hevc_surface(VADriverContextP ctx,
}
}
+#define ALLOC_HCPD_BUFFER(gen_buffer, string, size) do { \
+ if (!gen_buffer->bo || size > gen_buffer->bo->size) { \
+ ALLOC_GEN_BUFFER(gen_buffer, string, size); \
+ } \
+ } while (0);
+
static VAStatus
gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
struct decode_state *decode_state,
@@ -106,25 +112,8 @@ gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
{
struct i965_driver_data *i965 = i965_driver_data(ctx);
VAPictureParameterBufferHEVC *pic_param;
- VASliceParameterBufferHEVC *slice_param;
struct object_surface *obj_surface;
uint32_t size;
- int i, j, has_inter = 0;
-
- for (j = 0; j < decode_state->num_slice_params && !has_inter; j++) {
- assert(decode_state->slice_params && decode_state->slice_params[j]->buffer);
- slice_param = (VASliceParameterBufferHEVC *)decode_state->slice_params[j]->buffer;
-
- for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
- if (slice_param->LongSliceFlags.fields.slice_type == HEVC_SLICE_B ||
- slice_param->LongSliceFlags.fields.slice_type == HEVC_SLICE_P) {
- has_inter = 1;
- break;
- }
-
- slice_param++;
- }
- }
assert(decode_state->pic_param && decode_state->pic_param->buffer);
pic_param = (VAPictureParameterBufferHEVC *)decode_state->pic_param->buffer;
@@ -152,50 +141,36 @@ gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
size = ALIGN(gen9_hcpd_context->picture_width_in_pixels, 32) >> 3;
size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_line_buffer), "line buffer", size);
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_line_buffer), "tile line buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->deblocking_filter_line_buffer), "line buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_line_buffer), "tile line buffer", size);
size = ALIGN(gen9_hcpd_context->picture_height_in_pixels + 6 * gen9_hcpd_context->picture_height_in_ctbs, 32) >> 3;
size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_column_buffer), "tile column buffer", size);
-
- if (has_inter) {
- size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 188 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_line_buffer), "metadata line buffer", size);
-
- size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 172 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer), "metadata tile line buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->deblocking_filter_tile_column_buffer), "tile column buffer", size);
- size = (((gen9_hcpd_context->picture_height_in_pixels + 15) >> 4) * 176 + 89 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer), "metadata tile column buffer", size);
- } else {
- size = (gen9_hcpd_context->picture_width_in_pixels + 8 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_line_buffer), "metadata line buffer", size);
+ size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 188 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+ size <<= 6;
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->metadata_line_buffer), "metadata line buffer", size);
- size = (gen9_hcpd_context->picture_width_in_pixels + 16 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer), "metadata tile line buffer", size);
+ size = (((gen9_hcpd_context->picture_width_in_pixels + 15) >> 4) * 172 + 9 * gen9_hcpd_context->picture_width_in_ctbs + 1023) >> 9;
+ size <<= 6;
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->metadata_tile_line_buffer), "metadata tile line buffer", size);
- size = (gen9_hcpd_context->picture_height_in_pixels + 8 * gen9_hcpd_context->picture_height_in_ctbs + 1023) >> 9;
- size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer), "metadata tile column buffer", size);
- }
+ size = (((gen9_hcpd_context->picture_height_in_pixels + 15) >> 4) * 176 + 89 * gen9_hcpd_context->picture_height_in_ctbs + 1023) >> 9;
+ size <<= 6;
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->metadata_tile_column_buffer), "metadata tile column buffer", size);
size = ALIGN(((gen9_hcpd_context->picture_width_in_pixels >> 1) + 3 * gen9_hcpd_context->picture_width_in_ctbs), 16) >> 3;
size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_line_buffer), "sao line buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->sao_line_buffer), "sao line buffer", size);
size = ALIGN(((gen9_hcpd_context->picture_width_in_pixels >> 1) + 6 * gen9_hcpd_context->picture_width_in_ctbs), 16) >> 3;
size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_tile_line_buffer), "sao tile line buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->sao_tile_line_buffer), "sao tile line buffer", size);
size = ALIGN(((gen9_hcpd_context->picture_height_in_pixels >> 1) + 6 * gen9_hcpd_context->picture_height_in_ctbs), 16) >> 3;
size <<= 6;
- ALLOC_GEN_BUFFER((&gen9_hcpd_context->sao_tile_column_buffer), "sao tile column buffer", size);
+ ALLOC_HCPD_BUFFER((&gen9_hcpd_context->sao_tile_column_buffer), "sao tile column buffer", size);
gen9_hcpd_context->first_inter_slice_collocated_ref_idx = 0;
gen9_hcpd_context->first_inter_slice_collocated_from_l0_flag = 0;
@@ -204,6 +179,8 @@ gen9_hcpd_hevc_decode_init(VADriverContextP ctx,
return VA_STATUS_SUCCESS;
}
+#undef ALLOC_HCPD_BUFFER
+
static void
gen9_hcpd_pipe_mode_select(VADriverContextP ctx,
struct decode_state *decode_state,
--
1.9.1
More information about the Libva
mailing list