From c8a6c7ff024ee12ee29ea459098082032d65e363 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Mon, 15 Apr 2024 09:42:02 +0200 Subject: [PATCH] radv/video: Set correct bit depth and format for 10bit input Fixes: 967e4e09dee ("radv/video: add h265 encode support") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/11011 Part-of: (cherry picked from commit 2d0282f5762c4980aa2f926f5d1b966d31118693) --- .pick_status.json | 2 +- src/amd/vulkan/radv_video_enc.c | 42 ++++++++++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index db7319af435..5e2ea9f8ecd 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1114,7 +1114,7 @@ "description": "radv/video: Set correct bit depth and format for 10bit input", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "967e4e09dee81b93cfb30195ab5e1878aca9dbd0", "notes": null diff --git a/src/amd/vulkan/radv_video_enc.c b/src/amd/vulkan/radv_video_enc.c index 0f5c1fd2116..c2e7e217bcf 100644 --- a/src/amd/vulkan/radv_video_enc.c +++ b/src/amd/vulkan/radv_video_enc.c @@ -1526,6 +1526,24 @@ radv_enc_input_format(struct radv_cmd_buffer *cmd_buffer) struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); struct radeon_cmdbuf *cs = cmd_buffer->cs; + struct radv_video_session *vid = cmd_buffer->video.vid; + uint32_t color_bit_depth; + uint32_t color_packing_format; + + switch (vid->vk.picture_format) { + case VK_FORMAT_G8_B8R8_2PLANE_420_UNORM: + color_bit_depth = RENCODE_COLOR_BIT_DEPTH_8_BIT; + color_packing_format = RENCODE_COLOR_PACKING_FORMAT_NV12; + break; + case VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16: + color_bit_depth = RENCODE_COLOR_BIT_DEPTH_10_BIT; + color_packing_format = RENCODE_COLOR_PACKING_FORMAT_P010; + break; + default: + assert(0); + return; + } + ENC_BEGIN; radeon_emit(cs, pdev->vcn_enc_cmds.input_format); radeon_emit(cs, 0); // input color volume @@ -1533,8 +1551,8 @@ radv_enc_input_format(struct radv_cmd_buffer *cmd_buffer) radeon_emit(cs, RENCODE_COLOR_RANGE_STUDIO); // input color range radeon_emit(cs, 0); // input chroma subsampling radeon_emit(cs, 0); // input chroma location - radeon_emit(cs, 0); // input color bit depth - radeon_emit(cs, 0); // input color packing format + radeon_emit(cs, color_bit_depth); // input color bit depth + radeon_emit(cs, color_packing_format); // input color packing format ENC_END; } @@ -1544,12 +1562,30 @@ radv_enc_output_format(struct radv_cmd_buffer *cmd_buffer) struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_physical_device *pdev = radv_device_physical(device); struct radeon_cmdbuf *cs = cmd_buffer->cs; + struct radv_video_session *vid = cmd_buffer->video.vid; + uint32_t color_bit_depth; + + switch (vid->vk.op) { + case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: + color_bit_depth = RENCODE_COLOR_BIT_DEPTH_8_BIT; + break; + case VK_VIDEO_CODEC_OPERATION_ENCODE_H265_BIT_KHR: + if (vid->vk.h265.profile_idc == STD_VIDEO_H265_PROFILE_IDC_MAIN_10) + color_bit_depth = RENCODE_COLOR_BIT_DEPTH_10_BIT; + else + color_bit_depth = RENCODE_COLOR_BIT_DEPTH_8_BIT; + break; + default: + assert(0); + return; + } + ENC_BEGIN; radeon_emit(cs, pdev->vcn_enc_cmds.output_format); radeon_emit(cs, 0); // output color volume radeon_emit(cs, RENCODE_COLOR_RANGE_STUDIO); // output color range radeon_emit(cs, 0); // output chroma location - radeon_emit(cs, 0); // output color bit depth + radeon_emit(cs, color_bit_depth); // output color bit depth ENC_END; }