Otherwise it might result in GPU hang

Signed-off-by: Xiang, Haihao <[email protected]>
---
 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

_______________________________________________
Libva mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/libva

Reply via email to