anv/video: initial support for h264 encoding

Co-authored-by: Dave Airlie <airlied@redhat.com>

Signed-off-by: Hyunjun Ko <zzoon@igalia.com>
Acked-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27810>
This commit is contained in:
Hyunjun Ko 2024-01-30 09:40:40 +09:00 committed by Marge Bot
parent f6c3e82201
commit 3ec8f7f995
5 changed files with 1124 additions and 8 deletions

View file

@ -6094,6 +6094,7 @@ struct anv_video_session {
struct anv_video_session_params {
struct vk_video_session_parameters vk;
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode;
};
void

View file

@ -202,6 +202,60 @@ anv_GetPhysicalDeviceVideoCapabilitiesKHR(VkPhysicalDevice physicalDevice,
default:
break;
}
struct VkVideoEncodeCapabilitiesKHR *enc_caps = (struct VkVideoEncodeCapabilitiesKHR *)
vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_CAPABILITIES_KHR);
if (enc_caps) {
enc_caps->flags = 0;
enc_caps->rateControlModes = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR;
enc_caps->maxRateControlLayers = 1;
enc_caps->maxQualityLevels = 1;
enc_caps->encodeInputPictureGranularity.width = 32;
enc_caps->encodeInputPictureGranularity.height = 32;
enc_caps->supportedEncodeFeedbackFlags =
VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BUFFER_OFFSET_BIT_KHR |
VK_VIDEO_ENCODE_FEEDBACK_BITSTREAM_BYTES_WRITTEN_BIT_KHR;
}
switch (pVideoProfile->videoCodecOperation) {
case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR: {
struct VkVideoEncodeH264CapabilitiesKHR *ext = (struct VkVideoEncodeH264CapabilitiesKHR *)
vk_find_struct(pCapabilities->pNext, VIDEO_ENCODE_H264_CAPABILITIES_KHR);
if (ext) {
ext->flags = VK_VIDEO_ENCODE_H264_CAPABILITY_HRD_COMPLIANCE_BIT_KHR;
ext->maxLevelIdc = STD_VIDEO_H264_LEVEL_IDC_5_1;
ext->maxSliceCount = 1;
ext->maxPPictureL0ReferenceCount = 8;
ext->maxBPictureL0ReferenceCount = 8;
ext->maxL1ReferenceCount = 0;
ext->maxTemporalLayerCount = 0;
ext->expectDyadicTemporalLayerPattern = false;
ext->prefersGopRemainingFrames = 0;
ext->requiresGopRemainingFrames = 0;
ext->minQp = 10;
ext->maxQp = 51;
}
pCapabilities->minBitstreamBufferOffsetAlignment = 32;
pCapabilities->minBitstreamBufferSizeAlignment = 4096;
pCapabilities->maxDpbSlots = ANV_VIDEO_H264_MAX_NUM_REF_FRAME;
pCapabilities->maxActiveReferencePictures = ANV_VIDEO_H264_MAX_NUM_REF_FRAME;
pCapabilities->pictureAccessGranularity.width = ANV_MB_WIDTH;
pCapabilities->pictureAccessGranularity.height = ANV_MB_HEIGHT;
pCapabilities->minCodedExtent.width = ANV_MB_WIDTH;
pCapabilities->minCodedExtent.height = ANV_MB_HEIGHT;
strcpy(pCapabilities->stdHeaderVersion.extensionName, VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_EXTENSION_NAME);
pCapabilities->stdHeaderVersion.specVersion = VK_STD_VULKAN_VIDEO_CODEC_H264_ENCODE_SPEC_VERSION;
break;
}
default:
break;
}
return VK_SUCCESS;
}
@ -388,6 +442,12 @@ anv_GetVideoSessionMemoryRequirementsKHR(VkDevice _device,
pVideoSessionMemoryRequirementsCount,
memory_types);
break;
case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
get_h264_video_session_mem_reqs(vid,
mem_reqs,
pVideoSessionMemoryRequirementsCount,
memory_types);
break;
default:
unreachable("unknown codec");
}
@ -428,6 +488,11 @@ anv_BindVideoSessionMemoryKHR(VkDevice _device,
copy_bind(&vid->vid_mem[bind_mem[i].memoryBindIndex], &bind_mem[i]);
}
break;
case VK_VIDEO_CODEC_OPERATION_ENCODE_H264_BIT_KHR:
for (unsigned i = 0; i < bind_mem_count; i++) {
copy_bind(&vid->vid_mem[bind_mem[i].memoryBindIndex], &bind_mem[i]);
}
break;
default:
unreachable("unknown codec");
}

View file

@ -51,6 +51,19 @@ genX(CmdControlVideoCodingKHR)(VkCommandBuffer commandBuffer,
flush.VideoPipelineCacheInvalidate = 1;
}
}
if (pCodingControlInfo->flags & VK_VIDEO_CODING_CONTROL_ENCODE_RATE_CONTROL_BIT_KHR) {
const struct VkVideoEncodeRateControlInfoKHR *rate_control_info =
vk_find_struct_const(pCodingControlInfo->pNext, VIDEO_ENCODE_RATE_CONTROL_INFO_KHR);
/* Support for only CQP rate control for the moment */
assert((rate_control_info->rateControlMode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR) ||
(rate_control_info->rateControlMode == VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DISABLED_BIT_KHR));
cmd_buffer->video.params->rc_mode = rate_control_info->rateControlMode;
} else {
cmd_buffer->video.params->rc_mode = VK_VIDEO_ENCODE_RATE_CONTROL_MODE_DEFAULT_KHR;
}
}
void
@ -1185,11 +1198,3 @@ genX(CmdDecodeVideoKHR)(VkCommandBuffer commandBuffer,
assert(0);
}
}
#ifdef VK_ENABLE_BETA_EXTENSIONS
void
genX(CmdEncodeVideoKHR)(VkCommandBuffer commandBuffer,
const VkVideoEncodeInfoKHR *pEncodeInfo)
{
}
#endif

File diff suppressed because it is too large Load diff

View file

@ -90,6 +90,7 @@ anv_per_hw_ver_files = files(
'genX_cmd_draw_generated_flush.h',
'genX_cmd_draw_generated_indirect.h',
'genX_cmd_video.c',
'genX_cmd_video_enc.c',
'genX_gfx_state.c',
'genX_gpu_memcpy.c',
'genX_init_state.c',