From 63dcfed81f011dae5ca68af3369433be28135415 Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Sat, 15 Jul 2017 19:51:56 +0100 Subject: [PATCH] st/va: Fix scaling list ordering for H.265 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Mesa here requires the scaling lists in diagonal scan order, but VAAPI passes them in raster scan order. Therefore, rearrange the elements when copying. v2: Move scan tables to vl_zscan.c. Fix type in size assertion. Cc: mesa-stable@lists.freedesktop.org Signed-off-by: Mark Thompson Reviewed-by: Christian König --- src/gallium/auxiliary/vl/vl_zscan.c | 21 +++++++++++++ src/gallium/auxiliary/vl/vl_zscan.h | 2 ++ src/gallium/state_trackers/va/picture_hevc.c | 33 +++++++++++++++----- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/src/gallium/auxiliary/vl/vl_zscan.c b/src/gallium/auxiliary/vl/vl_zscan.c index 24d64525b76..75013c42bfe 100644 --- a/src/gallium/auxiliary/vl/vl_zscan.c +++ b/src/gallium/auxiliary/vl/vl_zscan.c @@ -95,6 +95,27 @@ const int vl_zscan_alternate[] = 38,46,54,62,39,47,55,63 }; +const int vl_zscan_h265_up_right_diagonal_16[] = +{ + /* Up-right diagonal scan order for 4x4 blocks - see H.265 section 6.5.3. */ + 0, 4, 1, 8, 5, 2, 12, 9, + 6, 3, 13, 10, 7, 14, 11, 15, +}; + +const int vl_zscan_h265_up_right_diagonal[] = +{ + /* Up-right diagonal scan order for 8x8 blocks - see H.265 section 6.5.3. */ + 0, 8, 1, 16, 9, 2, 24, 17, + 10, 3, 32, 25, 18, 11, 4, 40, + 33, 26, 19, 12, 5, 48, 41, 34, + 27, 20, 13, 6, 56, 49, 42, 35, + 28, 21, 14, 7, 57, 50, 43, 36, + 29, 22, 15, 58, 51, 44, 37, 30, + 23, 59, 52, 45, 38, 31, 60, 53, + 46, 39, 61, 54, 47, 62, 55, 63, +}; + + static void * create_vert_shader(struct vl_zscan *zscan) { diff --git a/src/gallium/auxiliary/vl/vl_zscan.h b/src/gallium/auxiliary/vl/vl_zscan.h index 268cf0a6e32..292152e873e 100644 --- a/src/gallium/auxiliary/vl/vl_zscan.h +++ b/src/gallium/auxiliary/vl/vl_zscan.h @@ -68,6 +68,8 @@ extern const int vl_zscan_normal_16[]; extern const int vl_zscan_linear[]; extern const int vl_zscan_normal[]; extern const int vl_zscan_alternate[]; +extern const int vl_zscan_h265_up_right_diagonal_16[]; +extern const int vl_zscan_h265_up_right_diagonal[]; struct pipe_sampler_view * vl_zscan_layout(struct pipe_context *pipe, const int layout[64], unsigned blocks_per_line); diff --git a/src/gallium/state_trackers/va/picture_hevc.c b/src/gallium/state_trackers/va/picture_hevc.c index 28743ee7aa6..e879259ae1f 100644 --- a/src/gallium/state_trackers/va/picture_hevc.c +++ b/src/gallium/state_trackers/va/picture_hevc.c @@ -25,6 +25,7 @@ * **************************************************************************/ +#include "vl/vl_zscan.h" #include "va_private.h" void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf) @@ -179,14 +180,32 @@ void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf) { VAIQMatrixBufferHEVC *h265 = buf->data; + int i, j; - assert(buf->size >= sizeof(VAIQMatrixBufferH264) && buf->num_elements == 1); - memcpy(&context->desc.h265.pps->sps->ScalingList4x4, h265->ScalingList4x4, 6 * 16); - memcpy(&context->desc.h265.pps->sps->ScalingList8x8, h265->ScalingList8x8, 6 * 64); - memcpy(&context->desc.h265.pps->sps->ScalingList16x16, h265->ScalingList16x16, 6 * 64); - memcpy(&context->desc.h265.pps->sps->ScalingList32x32, h265->ScalingList32x32, 2 * 64); - memcpy(&context->desc.h265.pps->sps->ScalingListDCCoeff16x16, h265->ScalingListDC16x16, 6); - memcpy(&context->desc.h265.pps->sps->ScalingListDCCoeff32x32, h265->ScalingListDC32x32, 2); + assert(buf->size >= sizeof(VAIQMatrixBufferHEVC) && buf->num_elements == 1); + + for (i = 0; i < 6; i++) { + for (j = 0; j < 16; j++) + context->desc.h265.pps->sps->ScalingList4x4[i][j] = + h265->ScalingList4x4[i][vl_zscan_h265_up_right_diagonal_16[j]]; + + for (j = 0; j < 64; j++) { + context->desc.h265.pps->sps->ScalingList8x8[i][j] = + h265->ScalingList8x8[i][vl_zscan_h265_up_right_diagonal[j]]; + context->desc.h265.pps->sps->ScalingList16x16[i][j] = + h265->ScalingList16x16[i][vl_zscan_h265_up_right_diagonal[j]]; + + if (i < 2) + context->desc.h265.pps->sps->ScalingList32x32[i][j] = + h265->ScalingList32x32[i][vl_zscan_h265_up_right_diagonal[j]]; + } + + context->desc.h265.pps->sps->ScalingListDCCoeff16x16[i] = + h265->ScalingListDC16x16[i]; + if (i < 2) + context->desc.h265.pps->sps->ScalingListDCCoeff32x32[i] = + h265->ScalingListDC32x32[i]; + } } void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf) -- 2.30.2