mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-01 16:10:09 +01:00
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:
parent
f6c3e82201
commit
3ec8f7f995
5 changed files with 1124 additions and 8 deletions
|
|
@ -6094,6 +6094,7 @@ struct anv_video_session {
|
|||
|
||||
struct anv_video_session_params {
|
||||
struct vk_video_session_parameters vk;
|
||||
VkVideoEncodeRateControlModeFlagBitsKHR rc_mode;
|
||||
};
|
||||
|
||||
void
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
1044
src/intel/vulkan/genX_cmd_video_enc.c
Normal file
1044
src/intel/vulkan/genX_cmd_video_enc.c
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -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',
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue