From f26114aef700d28730f6586a71d9f2526f5083f5 Mon Sep 17 00:00:00 2001 From: Zhao Yakui Date: Tue, 16 Apr 2013 13:57:42 +0800 Subject: [PATCH] Create the image with aligned width/height on BDW The hardware requires that the surface pitch should be 64 alignment. Otherwise the data port can't be accessed correctly. Signed-off-by: Zhao Yakui --- src/i965_drv_video.c | 52 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 22 deletions(-) diff --git a/src/i965_drv_video.c b/src/i965_drv_video.c index 997edfa..58b67bb 100755 --- a/src/i965_drv_video.c +++ b/src/i965_drv_video.c @@ -2671,7 +2671,7 @@ i965_CreateImage(VADriverContextP ctx, struct object_image *obj_image; VAStatus va_status = VA_STATUS_ERROR_OPERATION_FAILED; VAImageID image_id; - unsigned int width2, height2, size2, size; + unsigned int size2, size, awidth, aheight; out_image->image_id = VA_INVALID_ID; out_image->buf = VA_INVALID_ID; @@ -2691,10 +2691,18 @@ i965_CreateImage(VADriverContextP ctx, image->image_id = image_id; image->buf = VA_INVALID_ID; - size = width * height; - width2 = (width + 1) / 2; - height2 = (height + 1) / 2; - size2 = width2 * height2; + awidth = ALIGN(width, 64); + + if ((format->fourcc == VA_FOURCC('Y','V','1','2')) || + (format->fourcc == VA_FOURCC('I','4','2','0'))) { + if (awidth % 128 != 0) { + awidth = ALIGN(width, 128); + } + } + + aheight = ALIGN(height, 16); + size = awidth * aheight; + size2 = (awidth / 2) * (aheight / 2); image->num_palette_entries = 0; image->entry_bytes = 0; @@ -2704,9 +2712,9 @@ i965_CreateImage(VADriverContextP ctx, case VA_FOURCC('I','A','4','4'): case VA_FOURCC('A','I','4','4'): image->num_planes = 1; - image->pitches[0] = width; + image->pitches[0] = awidth; image->offsets[0] = 0; - image->data_size = image->offsets[0] + image->pitches[0] * height; + image->data_size = image->offsets[0] + image->pitches[0] * aheight; image->num_palette_entries = 16; image->entry_bytes = 3; image->component_order[0] = 'R'; @@ -2716,9 +2724,9 @@ i965_CreateImage(VADriverContextP ctx, case VA_FOURCC('I','A','8','8'): case VA_FOURCC('A','I','8','8'): image->num_planes = 1; - image->pitches[0] = width * 2; + image->pitches[0] = awidth * 2; image->offsets[0] = 0; - image->data_size = image->offsets[0] + image->pitches[0] * height; + image->data_size = image->offsets[0] + image->pitches[0] * aheight; image->num_palette_entries = 256; image->entry_bytes = 3; image->component_order[0] = 'R'; @@ -2732,42 +2740,42 @@ i965_CreateImage(VADriverContextP ctx, case VA_FOURCC('B','G','R','X'): case VA_FOURCC('R','G','B','X'): image->num_planes = 1; - image->pitches[0] = width * 4; + image->pitches[0] = awidth * 4; image->offsets[0] = 0; - image->data_size = image->offsets[0] + image->pitches[0] * height; + image->data_size = image->offsets[0] + image->pitches[0] * aheight; break; case VA_FOURCC('Y','V','1','2'): image->num_planes = 3; - image->pitches[0] = width; + image->pitches[0] = awidth; image->offsets[0] = 0; - image->pitches[1] = width2; - image->offsets[1] = size + size2; - image->pitches[2] = width2; - image->offsets[2] = size; + image->pitches[1] = awidth / 2; + image->offsets[1] = size; + image->pitches[2] = awidth / 2; + image->offsets[2] = size + size2; image->data_size = size + 2 * size2; break; case VA_FOURCC('I','4','2','0'): image->num_planes = 3; - image->pitches[0] = width; + image->pitches[0] = awidth; image->offsets[0] = 0; - image->pitches[1] = width2; + image->pitches[1] = awidth / 2; image->offsets[1] = size; - image->pitches[2] = width2; + image->pitches[2] = awidth / 2; image->offsets[2] = size + size2; image->data_size = size + 2 * size2; break; case VA_FOURCC('N','V','1','2'): image->num_planes = 2; - image->pitches[0] = width; + image->pitches[0] = awidth; image->offsets[0] = 0; - image->pitches[1] = width; + image->pitches[1] = awidth; image->offsets[1] = size; image->data_size = size + 2 * size2; break; case VA_FOURCC('Y','U','Y','2'): case VA_FOURCC('U','Y','V','Y'): image->num_planes = 1; - image->pitches[0] = width * 2; + image->pitches[0] = awidth * 2; image->offsets[0] = 0; image->data_size = size * 2; break; -- 2.7.4